【作用域】
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的指向。