var关键字
任何时候,变量只能通过使用var关键字才能声明。不使用var 声明的只是全局对象的一个属性,可以使用delete操作符进行删除。
全局代码中的this
在全局代码中,this始终是全局对象本身,这样就有可能间接的引用到它了。
函数代码中的this
这种类型的代码中,this值的首要特点(或许是最主要的)是它不是静态的绑定到一个函数。
this是进入上下文时确定,在一个函数代码中,这个值在每一次完全不同。
不管怎样,在代码运行时的this值是不变的,也就是说,因为它不是一个变量,就不可能为其分配一个新值
但可以声明一个var 变量 来存储 当前的 this
引用类型的值只有两种情况:
- 当我们处理一个标示符时
- 或一个属性访问器
在该算法的返回值中,总是一个引用类型的值(这对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/