MyException - 我的异常网
当前位置:我的异常网» JavaScript » js变量跟作用域

js变量跟作用域

www.MyException.Cn  网友分享于:2013-11-16  浏览:0次
js变量和作用域

 

 基本集类型的值和引用类型的值

     5种基本数据类型:Undefined、Null、Boolean、Number和String,这5种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。

动态属性:

我们创建了一个对象并将值保存在了person中,然后为这个值添加属性。对象不销毁则这个值一直存在。

var person = new Object();
person.name = "Nicholas";
alert(person.name);  //"Nicholas"

 但是我们不能给基本数据类型添加属性,比如:

var name = "Nicholas";
name.age = 27;
alert(name.age);    //undefined

 

复制变量:

 从一个变量向另一个变量复制基本数据类型时,会在变量上创建一个新的对象。他们的值是不会相互影响的。例如:

var num1 = 5;
var num2 = num1;
num1 = 10;
alert(num1);    //10
alert(num2);    //5

 从一个变量向另一个变量复制引用类型时,这个值实际上是一个指针,两个变量实际上引用的同一个对象。例如:

 

var obj1 = new Object();
var obj2 = obj1;
obj1.name = ”Nicholas“;
alert(obj2.name);    //"Nicholas"

 

参数传递:

在向参数传递基本数据类型的值时,被传递的值会被复制给一个内部变量(即命名参数,就是arguments对象的一个元素)。例如:

 

function addTen(num){
    num += 10;
    return num;
}
var count = 20;
var result = addTen(count);
alert(count);    //20
alert(result);    //30
 在向参数传递引用类型的值时,这个值的内存地址复制给一个内部变量。例如:

 

 

function setName(obj){
    obj.name = "Nicholas";
}
var person = new Object();
setName(person);
alert(person.name);    //Nicjolas
 以上代码创建了一个对象,person和obj引用了同一个对象。于是,当在函数内部为obj添加name属性时,外部的person也将改变;下面例子说明了参数是按值传递的,而不是按引用类型传递:

 

 

function setName(obj){
    obj.name = "Nicholas";
    obj = new Object();
    obj.name = "Greg";
}
var person = new Object();
setName(person);
alert(person.name);    //Nicjolas
 函数内部修改了参数的值,但原始引用让然保持不变。实际上,当函数内部重写obj时,这个变量引用的就是一个局部对象了,这个局部对象在函数执行完后立即被销毁。

 

 

类型检测:

要检测一个变量是不是基本数据类型,typeof操作符是最佳工具。

 

var s = "Nicholas";
var b = true;
var i = 22;
var u;
var n = null;
var o = new Object();

alert(typeof s);    //string
alert(typeof b);    //boolean
alert(typeof i);    //number
alert(typeof u);    //undefined
alert(typeof n);    //object
alert(typeof o);    //object
 检测引用类型的值时,ECMAScript提供了instanceof操作符,语法如下:

 

 

alert(person instanceof Object);    //true
alert(colors instanceof Array);     //true
 检测对象时始终返回true ,检测基本类型时返回false。

 

 

执行环境和作用域:

全局执行环境是最外层的一个执行环境,在Web浏览器中,全局执行环境是window对象。

 

var color = "blue";
function changeColor(){
    var anotherColor = "red";

    function swapColors(){
        var tempColor = anoterColor;
        anotherColor = color;
        color = tempColor;
        
        // 这里可以访问color、anotherColor和tempColor
    }
    // 这里可以访问color和anotherColor,但是不能访问tempColor
    swapColor();
}

// 这里只能访问color
changeColor();
 延长作用域链:

 

try-catch语句catch块 和 with语句。两个语句都会在作用域链的前端添加一个变量对象。

 

function buildUrl(){
    var qs = "?debug=true";

    with(location){    //接收location对象
        var url = href + qs;
    }

    return url;
}

try{
   ... 
}catch(e){
   alert(e);    //被抛出的错误对象 
}
 with语句中引用变量href时,实际上是location.href,(可以使用location对象里边的所有属性和方法)。

 

没有块级作用域:

例子:

 

if (true) {
     var color = "red";
}

alert(color);    // red
 for循环中的变量:

 

 

for (var i = 0; i < 10; i++) {
   doSomething(i);
}

alert(i);    // 10
 有for循环创建的变量i即使在循环结束后,依旧存在于循环外部的执行环境中;

 

变量声明:

 

// 使用var声明的变量
function add(num1, num2){
    var sum = num1 + num2;
    return sum;
}

var result = add(10, 20);
alert(result);    //30
alert(sum);      //这里会抛出错误

// 没有var声明的变量
function add(num1, num2){
    sum = num1 + num2;
    return sum;
}
var result = add(10, 20);
alert(result);    //30
alert(sum);    //30

 使用var声明变量会添加到最近的作用域中,否则将会添加到全局作用域中。

 

 

 

文章评论

中美印日四国程序员比较
中美印日四国程序员比较
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
总结2014中国互联网十大段子
总结2014中国互联网十大段子
程序员和编码员之间的区别
程序员和编码员之间的区别
如何成为一名黑客
如何成为一名黑客
编程语言是女人
编程语言是女人
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
一个程序员的时间管理
一个程序员的时间管理
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
那些争议最大的编程观点
那些争议最大的编程观点
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员应该关注的一些事儿
程序员应该关注的一些事儿
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
鲜为人知的编程真相
鲜为人知的编程真相
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
我的丈夫是个程序员
我的丈夫是个程序员
代码女神横空出世
代码女神横空出世
程序员都该阅读的书
程序员都该阅读的书
漫画:程序员的工作
漫画:程序员的工作
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
 程序员的样子
程序员的样子
Java程序员必看电影
Java程序员必看电影
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
程序员的鄙视链
程序员的鄙视链
程序员必看的十大电影
程序员必看的十大电影
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
为什么程序员都是夜猫子
为什么程序员都是夜猫子
10个调试和排错的小建议
10个调试和排错的小建议
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
老程序员的下场
老程序员的下场
我是如何打败拖延症的
我是如何打败拖延症的
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有