首页 > 代码库 > 变量、作用域和内存问题 (完)

变量、作用域和内存问题 (完)

  早安,今天有一个好心情,今天把这一章做一个结束吧。

  因为上次说了一些有关js中作用域的问题,所以今天就说一个特殊的语句with语句,with语句的作用就是将代码的作用域设置到一个特定的对象中,如果代码被设置到了一个特定的对象中,也就意味着可以直接调用该对象的任意属性和函数返回值,使用with语句的目的主要是为了简化多次编写同一个对象的工作,但是对with只需要停留在理解阶段就好,出于对代码的可读性和对性能的考虑在实际编写代码的过程中不建议使用。

function buildUrl(){
    var qs=‘?debug=true‘;
    with(location){
        var url=href+qs;
    }
    return url;
}
console.log(buildUrl());

在上面的这个例子中,with语句接收的是location对象,因此location的作用域就被加入了作用域链中,在with语句作用的范围下,变量对象就包含了location对象的所有属性和方法,引用变量href实际上就是对location.href的调用。

 

还有就是一个有关于js中一个很随意的东西,就是js 没有块级作用域,所谓的块级作用域就是在C++中如果写一个for循环是按照一下方式来进行的

for(int i=0;i<10;i++){
  cout<<i;
}
cout<<i;//这里一定会报错,i is not defined 

也就是说在for循环块中定义的变量9只能在for 循环中使用,一旦出了for循环,这个变量就出栈了,但是在js中不一样

for(var i=0;i<10;i++){
  console.log(i);//0,1,2...9
}
console.log(i);//10

虽然最后出了for循环,但是i的值是没有被释放的,一样的可以访问到i,这就是因为js没有块级作用,在if或者for中声明的变量会自动加入当前的执行环境中,变为一个全局变量被使用。

显然上篇文章中也说过,函数是有自己的作用域的,在函数中声明的元素在函数外是不能被访问到的

test();
function test(){
  var temp=10;
}
console.log(temp);//这里是会报错的

这里的变量temp是在函数test中声明的,只能在test函数的环境下被访问到,不过,如果函数test改成这个样子:

test();
function test(){
  temp=10;
}
console.log(temp);//这里控制台是会输出10的

在函数test中没有使用var 对变量进行声明而是直接食用,这样虽然是合法的不会造成错误,但是js会默认的把该变量加入到全局环境中,这样即使是在函数外,也可以访问到该变量,这就提醒我们在实际的操作过程中要注意避免这种不用var声明就直接初始化的情况。

变量、作用域和内存问题 (完)