记录JS中的this

var关键字

任何时候,变量只能通过使用var关键字才能声明。不使用var 声明的只是全局对象的一个属性,可以使用delete操作符进行删除。

全局代码中的this

在全局代码中,this始终是全局对象本身,这样就有可能间接的引用到它了。

函数代码中的this

这种类型的代码中,this值的首要特点(或许是最主要的)是它不是静态的绑定到一个函数。

this是进入上下文时确定,在一个函数代码中,这个值在每一次完全不同。

不管怎样,在代码运行时的this值是不变的,也就是说,因为它不是一个变量,就不可能为其分配一个新值

但可以声明一个var 变量 来存储 当前的 this 

 

引用类型的值只有两种情况:

  1.     当我们处理一个标示符时
  2.     或一个属性访问器

在该算法的返回值中,总是一个引用类型的值(这对this来说很重要)。

标识符是变量名,函数名,函数参数名和全局对象中未识别的属性名。例如,下面标识符的值:

var foo = 10;
function bar() {}

属性访问器都应该熟悉。它有两种变体:点(.)语法(此时属性名是正确的标示符,且事先知道),或括号语法([])。

foo.bar();
foo['bar']();

 一个函数上下文中确定this值的通用规则如下:

在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用括号()的左边是引用类型的值,this将设为引用类型值的base对象(base object),在其他情况下(与引用类型不同的任何其它属性),这个值为null。不过,实际不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象。注:第5版的ECMAScript中,已经不强迫转换成全局变量了,而是赋值为undefined。

this 的关系跟引用的类型有关

函数调用和非引用类型

当调用括号的左边不是引用类型而是其它类型,这个值自动设置为null,结果为全局对象。

(function () {
  alert(this); // null => global
})();

在这个例子中,我们有一个函数对象但不是引用类型的对象(它不是标示符,也不是属性访问器),相应地,this值最终设为全局对象。

 

“this 变量:永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。

如果处在匿名函数中、或者不处于任何对象中,this 都指向宿主的根对象(在浏览器里面就是 window)”

没错,但我个人绝对,this就是一个需要宿主才可以生存的变量,我个人的判断,向this的上一级看,如果 this 是一个函数,那么宿主就肯定是window对象,如果this 是一个对象里面的,那么宿主就是对象或者是一个对象的方法里的this。

外,javascript中还用 call() 和 apply() 来调用函数,再记住下面这两句话:

如果是call()、apply()、with(),指定的this是谁,就是谁 !

普通的函数调用,函数被谁调用,this就是谁。

 参考:http://julying.com/blog/javascript-this/

 

posted @ 2012-08-11 15:23  黑色技术  阅读(165)  评论(0编辑  收藏  举报