美文网首页Web 前端开发
关于this对象的一个易错点

关于this对象的一个易错点

作者: aermin | 来源:发表于2017-04-26 23:58 被阅读0次

tips:接下去会在github写博客,简书不再更新和修改文章,欢迎大家逛逛我的新博客点击查看 ,我会尽量用更容易理解的方式写好每一篇博客,大家一起学习交流😄。

先给一个例子

var name = "The Window"
var object = {
    name : "My Object",
    
    f1 : function(){
       return function(){
           return this.name;
        };
    }
 };

  alert(object.f1()());  
       

这个例子返回的字符串是 "The Window",为啥不是"My Object"呢?

  • 原因是每个函数在被调用时, 其活动对象都会自动取得两个特殊变量:thisarguments</strong>。内部函数在搜索这两个变最时, 只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。
  • 也就是说要想让闭包【return function(){}】访问到外部函数【f1 :function(){}】里的this(或者arguments)变量,就要先将其赋值给到一个闭包能够访问到的变量里,如var that = this,这样就可以了。

修改后的例子如下

var name = "The Window"
var object = {
    name : "My Object",
    
    f1 : function(){
       var that = this; //添加这行
       return function(){
           return this.name;
        };
    }
 };

  alert(object.f1()()); 

返回"My Object"

另外一个例子

var name = "The Window•;
var object = {
    name : "My Object";
    getName: function() {
         return this.name;
    }
 };

上一个例子中的
return function(){
return this.name;
}
被换掉了,不再是闭包

object.getName(); //'My Object'
(object.getName)(); //'My Object"
(object.getName = object.getNamel (); //"The Window•, 在非严格模式下

第一行代码跟平常一样词用了object.getName (), 返回的是飞y Object", 因为this.name就是object.name。

第二行代码在调用这个方法前先给它加上了括号。虽然加上括号之后, 就好􀉀只是在引用一个函数, 但this的值得到了维持, 因为objec七.getName 和(object.getName)的定义是相同的。

第三行代码先执行了一条赋值语句,然后再诮用赋值后的结果。因为这个赋值表达式的值是函数本身, 所以this的值不能得到维持, 结果就返回了崎The Window飞

相关文章

  • 关于this对象的一个易错点

    tips:接下去会在github写博客,简书不再更新和修改文章,欢迎大家逛逛我的新博客点击查看 ,我会尽量用更容易...

  • string的使用

    string类型 string操作 易错点 s1 + ", "是string对象,+"world"是正确操作 "h...

  • 易错点

    rate_ave=1042.00/793 而非rate_ave=1042/793if rate>=rate_av...

  • 易错点

    泛型 泛型约束使用extends而非implements 泛型类型没有多态的说法,所以出现了?通配符 泛型方法必须...

  • 四级备考笔记

    易错点 NOT!!

  • 【重学】原型链

    大纲:构造函数手写new命令原型链Object对象的相关方法 (x)易错点 constructor表示构造函数和原...

  • 我理解的微信小程序显示隐藏 wx:if 和 hidden

    0 一个易错点 wx:if ="true" 是错的 需要写成 wx:if ="{{true}}"1 ...

  • BigDecimal的易错点

    divide 必须带四舍五入模式,用于解决若除不尽时,报四舍五入的异常 异常结果

  • 函件易错点

    能将思维导图更好的运用在工作上,不仅能让自己的思路变的清晰,也让增加了我对工作的兴趣和热情!希望自己会有更大的改变!

  • golang易错点

    sdfsdsdfs

网友评论

    本文标题:关于this对象的一个易错点

    本文链接:https://www.haomeiwen.com/subject/yozwzttx.html