自从接触javascript以来,对this参数的理解一直是模棱两可。虽有过深入去理解,但却也总感觉是那种浮于表面,没有完全理清头绪。
但对于this参数,确实会让人产生很多误解。那么this参数到底是何方神圣?
理解this
this是一个与执行上下文(execution context,也就是作用域)相关的特殊对象。因此,它可以叫作上下文对象(也就是用来指明执行上下文是在哪个上下 文中被触发的对象)。
任何对象都可以做为上下文中的this的值。在一些对ECMAScript执行上下文和部分this的描述中的 所产生误解。this经常被错误的描述成是变量对象的一个属性。 再重复一次:
this是执行上下文的一个属性,而不是变量对象的一个属性。 这个特性非常重要,因为与变量相反,this从不会参与到标识符解析过程。换句话说,在代码中当访问this的时候,它的值是直接从执行上下文中获取的,并不需要任何作用域链查找。this的值只在进入上下文的时候进行一次确定。
废话不多,先看一个板栗:
代码如下:
var test = function(){};
test.prototype = {
foo:"apple",
fun:function(){
this.foo="banana";
}
};
var myTest = new test();
myTest.fun();
console.log(myTest.hasOwnProperty("foo")); //输出什么
console.log(myTest.hasOwnProperty("fun")); //输出什么
hasOwnProperty:是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
不知道看官们心里的答案是什么,正确的答案是true,false。
代码如下:
console.log(myTest.hasOwnProperty("foo"));
console.log(myTest.hasOwnProperty("fun"));
true
false
要弄明白为什么是这样,就必须要理解上面this所扮演的角色,所指代的对象。在《javascript语言精粹》一书中,指出了在javascript中一共有四种调用模式:
1.方法调用模式
2.函数调用模式
3.构造器调用模式
4.apply调用模式
而在这些模式当中,对于如何初始化关键参数this上是存在不同差异的。
方法调用模式
当一个函数被保存为对象的一个属性时,我们称它为一个方法。当一个方法被调用时,this被绑定到该对象。注意加粗的这句是重点:
代码如下:
// 创建myObject。它有一个value属性和一个increment方法
var myObject = {
value: 0;
increment: function(inc) {
this.value += typeof inc ==='number'?inc:1; // 接受一个可选参数,如果不是数字,则默认为数字1
新闻热点
疑难解答