zoukankan      html  css  js  c++  java
  • javascript this对象 作用域链scope chain

    【作用域】

    var tt = 'aa';
    test();  //先调用后再定义
    function test(){
    alert(tt);    //undefined
    var tt = 'dd';
    alert(tt);    //dd}

    函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行。

    调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量)、函数参数及Arguments对象都在函数内的作用域中——这意味着它们隐藏了作用域链更上层的任何同名的属性。

    未使用var关键字定义的变量都是全局变量

     <script type="text/javascript" language="javascript">
    function rain(){
    x = 100; //声明了全局变量x并进行赋值
    }
    rain();
    alert( x ); //会弹出100
    </script>

    【实例】

    <HTML>
    <HEAD></HEAD>
    <BODY>
    <script type="text/javascript"> 
    //优先级排名:window属性<极晚绑定成员<类属性<原型属性<实例属性
    function foo(){
      foo.abc = function(){alert('类属性,或称静态属性')}
      this.abc = function(){alert('实例属性')}
      abc = function(){alert('@@@@@')};//若没用var声明,则会向上作用域搜索,直到window对象,若还没正式声明,则默认为window.abc
      var abc = function(){alert('$$$$$$')}//函数在定义它们的作用域里运行,而不是在执行它们的作用域里运行
    }
    foo.prototype.abc = function(){alert('原型属性');}
    foo.abc = function(){alert('极晚绑定成员,优先级极低');}
    var f = new foo();
    f.abc();
    foo.abc();
    abc();

    </script>
    </BODY>
    </HTML>

    【会改变this的操作】

    eval

      IE下:运行eval()会受当前作用域限制,运行execScript()则无视当前作用域,直接在全局作用域下执行。

      Firefox下:eval()和window.eval()效果不一样,这很奇怪,毕竟FF下,eval==window.eval。前者会受当前作用域限制,后者无视当前作用域,在全局作用域下执行(相当于IE的execScript())。

      with

      with会暂时修改作用域链。

      <script>
        function a(){
          with (b) {
             ...
          }
        }
        a();
      </script>

      函数a在定义的时候,就确定了a的作用域链,我们姑且认为这条链的最顶端是全局对象window。

    当函数a被执行的时候,javascript引擎生成了一个call object并将其添加到作用域链尾部上(window对象之后),语句运行到with(b)时,将b添加到作用域链的尾部。

    使用apply()call()掌控上下文,改变this指针

    【不会改变this的操作】this=>new object(拷贝)

    varPerson=Class.create({
      initialize:function(name){
        this.name=name;
      },
      say:function(message){
        alert(this.name+":"+message);
      }
    });
    varaPerson=new  Person("name1");
    aPerson.say("hello1");

    this指的是Person对象。

     

     要清楚的知道对于函数的每一步操作是拷贝还是引用(调用)

    function doSomething(){  alert(this.id);}
    alert(window.doSomething);//证明了doSomething是属于window的
    doSomething();//undefined
    window.onload=function(){
      document.getElementById("div2").onclick=doSomething;//div2
      document.getElementById("div3").onclick=function(){doSomething();}//undefined
    }

    <divid="div1"onclick="doSomething();">div1</div>=>undefined

     var fun=new dosomething();

    方法当类使用,就是拷贝,当方法使用就是引用。引用的时候,this指针表示,作用域链中优先级最高的那个对象

    而当类使用的时候,当前变量就是一个对象,且优先级最高,所以当前就是this的指向。

     

  • 相关阅读:
    团队冲刺(九)
    团队冲刺(八)
    团队冲刺(七)
    团队冲刺(六)
    团队冲刺(五)
    背景图片-密度屏幕(移动端)
    响应字体大小(移动端)
    FLEX 布局
    图片垂直居中
    css reset
  • 原文地址:https://www.cnblogs.com/AspDotNetMVC/p/1888514.html
Copyright © 2011-2022 走看看