您的位置:首页 > Web前端 > JavaScript

js变量作用域总结

2015-08-18 13:04 591 查看
1.this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象,this对象是在运行时基于函数的执行环境绑定的,在全局环境中,this等于window

eg1:

<script>

   var fullname = "Trigkit4";

   var person = {

       fullname : 'Jack',

   prop:{

       fullname : 'Blizzard',

       getFullname : function () {

           return this.fullname;

       }

   }

};

console.log(person.prop.getFullname());//Blizzard

var test = person.prop.getFullname;

console.log(test());//Trigkit4

</script>


this 的一般使用方法

1.1构造函数中使用 

这时,
this
就指这个新对象

<script type="text/javascript">
function test(){
this.x = 10;
}

var obj = new test();
alert(obj.x); //弹出 10;
</script>

1.2 this全局环境中使用的例子:

<script type="text/javascript">
var name = "全局";
function getName(){
var name = "局部";
return this.name;
};
alert(getName());//弹出 全局;
</script>

<script type="text/javascript">
var foo = {
test:function(){
alert(this);
}
}
foo.test();//object,因为test方法在调用时属于foo对象

var baz = foo.test;
baz();//window,因为baz()被调用时属于global对象
</script>


局部环境中的使用

<script type="text/javascript">
var name = "全局";

var jubu={
name:"局部",
getName:function(){
return this.name;
}
};
alert(jubu.getName());
</script>

作用域链中的this

<script type="text/javascript">
function scoping () {
console.log(this);

return function () {
console.log(this);
};
}

scoping()();
>>window
>> window
</script>
因为
scoping
函数属于window对象,自然作用域链中的函数也属于
window
对象

对象中的this 

var obj = {
foo: "test",
bar: function () {
console.log(this.foo);
}
};

obj.bar(); // "test"


2.值类型:数值、布尔值、null、undefined。

  引用类型:对象、数组、函数。
注意点:

2.0变量的赋值方面

如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定(对象有很多属性和方法),因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中
简而言之,堆内存存放引用值,栈内存存放固定类型值。“引用”是一个指向对象实际位置的指针。

   2.1复制变量值方面
由以上可以得出:在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是地址

   2.2传递参数方面
ECMAScript中,所有函数的参数都是按值传递的

   2.3执行环境及作用域
去掉var的局部变量-》全局变量

   2.4作用域

        变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域,window对象的所有属性拥有全局作用域;在代码任何地方都可以访问,函数内部声明并且以var修饰的变量就是局部变量,只能在函数体内使用,函数的参数虽然没有使用var但仍然是局部变量。

    没有块级作用域if和for都是这样的

eg:
script type="text/javascript">

if(true){                        //if语句的花括号没有作用域的功能。

var box = "trigkit4";

}

alert(box);//弹出 trigkit4

</script>
3.变量的查询
在变量的查询中,访问局部变量要比全局变量来得快,因此不需要向上搜索作用域链。
4.内存问题
javascript具有自动垃圾回收机制,一旦数据不再使用,可以将其设为"null"来释放引用
4.1 循环引用
 一个很简单的例子:一个DOM对象被一个Javascript对象引用,与此同时又引用同一个或其它的Javascript对象,这个DOM对象可能会引发内存泄露。这个DOM对象的引用将不会在脚本停止的时候被垃圾回收器回收。要想破坏循环引用,引用DOM元素的对象或DOM对象的引用需要被赋值为null。
4.2 闭包
 在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。
4.3 DOM泄露
  当原有的COM被移除时,子结点引用没有被移除则无法回收
4.4 Timers计(定)时器泄露

           eg:for (var i = 0; i < 90000; i++) {

  var buggyObject = {

    callAgain: function() {

      var ref = this;

      var val = setTimeout(function() {

        ref.callAgain();

     }, 90000);

    }

  }

  buggyObject.callAgain();

  //虽然你想回收但是timer还在

  buggyObject = null;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: