js变量作用域总结

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值