点击小眼睛开启蜘蛛网特效

javascript 巧用“this”:调用函数和引用函数的区别

《javascript 巧用“this”:调用函数和引用函数的区别》

this是函数体内自带的一个对象指针,它始终指向调用对象,但函数被调用时,使用this可以访问调用对象。如果this未包含属性,则传递的是当前对象。下面我们主要通过函数的引用和调用来感受一下this的灵活性。

函数的引用和调用分别表示不同的概念,虽然它们都无法改变函数的定义作用域,但是引用函数,却能够改变函数的执行作用域,而调用函数是不会改变函数的执行作用域的。

例1 函数的引用和调用

var o = {
    name: "对象o",
    f: function() {
        return this;
    }
}
o.o1 = {
    name: "对象o1",
    me: o.f    //引用对象o的方法f
}

在上面的例子中,函数中的this指的是的当前执行域对象o1;我们可以将方法me属性值o.f替换成对象o的方法 f后的属性值内容,可以理解为this动态的指向了o1,返回的就是o1;

调用结果:

var who = o.o1.me();
alert(who.name);    //返回字符串"对象o1",说明当前this代表对象o1

但是如果我们把对象o1的me属性值改为函数调用:

o.o1 = {
    name: "对象o1",
    me: o.f()    //调用对象o的方法f
}

则this所代表的是定义函数时所在的作用域对象o:

var who = o.o1.me;
alert(who.name);    //返回字符串“对象o”,说明当前this代表对象o

例2 使用call()和apply()

而call()和apply()方法就可以直接改变被执行函数的作用域,使其作用域指向所传递得参数对象。因此,函数中包含的this关键字也指向参数对象。

function f() { //函数f()
    alert(this.x + this.y);
}
var o = {      //对象直接量
    x: 1,
    y: 2
}
f.call(o);     //执行函数f(),返回值为3

使用call()方法执行函数f()时,call会把函数f()的作用域强制修改为参数对象所在的上下文,在上例中即call()方法把函数f()强制转换为对象o的一个方法并执行,这样函数f()中的this就代表对象o,所以this.x的值即为1,this.y的值即为2,结果就返回3。

 

 

 

  点赞
本篇文章采用 署名-非商业性使用-禁止演绎 4.0 国际 进行许可
转载请务必注明来源: https://oldpan.me/archives/javascript-use-this

   关注Oldpan博客微信公众号,你最需要的及时推送给你。