【作用域】

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的指向。

 

 

posted on 2012-11-10 22:58  极简  阅读(349)  评论(0编辑  收藏  举报