this作用域的问题

qianqian256 2018-07-25 05:42:09

代码一


 var name = "The Window";

  var object = {
    name : "My Object",

    getNameFunc : function(){
      return function(){
        return this.name;
      };

    }

  };

  alert(object.getNameFunc()());


代码二

var object = {
    name : "My Object",

    getNameFunc : function(){
var that = this;
      return function(){
        return this.name;
      };


    }

  };
 alert(object.getNameFunc()());

问题1.
为啥代码一中 ,运行结果不是My object,而且是方法调用,this的运行环境是object对象中呀
代码二为啥这样一改,就变成了M yobject
希望有详细解释 看了阮一峰的博客产生的疑问
问题2
sublimeText 出现了[WinError 2
] 系统找不到指定的文件。不能编译js代码,不知道如何解决
...全文
422 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
YUHUI01 2018-08-05
  • 打赏
  • 举报
回复
引用 9 楼 YUHUI01 的回复:
我只回答问题一,不用Sublime
因为getNameFunc的调用位置为object,所以代码二中的that实际上保存也就是object,但是return返回函数的话,会导致this绑定丢失,因为返回的函数实际上为隐式声明(假如你返回的函数名为fn1,则隐私声明为var fn=fn1)作用域则变为接收该函数的作用域,在这里则变成全局,使用that把this存储起来,可以达到你要的效果,实则引用了getNameFunc中的this
关于隐式丢失,可以参考以下代码
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
};
var bar=obj.foo;
var a="window";
bar()

代码中的var bar=obj.foo;,是为函数创建了别名,相当于bar直接调用了foo,所以foo的上下文环境也就发生了变化,成为了bar所在的作用域
YUHUI01 2018-08-05
  • 打赏
  • 举报
回复
我只回答问题一,不用Sublime
因为getNameFunc的调用位置为object,所以代码二中的that实际上保存也就是object,但是return返回函数的话,会导致this绑定丢失,因为返回的函数实际上为隐式声明(假如你返回的函数名为fn1,则隐私声明为var fn=fn1)作用域则变为接收该函数的作用域,在这里则变成全局,使用that把this存储起来,可以达到你要的效果,实则引用了getNameFunc中的this
关于隐式丢失,可以参考以下代码
function foo(){
console.log(this.a);
}
var obj={
a:2,
foo:foo
};
var bar=obj.foo;
var a="window";
bar()

改天换地 2018-08-05
  • 打赏
  • 举报
回复
问题1的object.getNameFunc()在词法作用域中不属于任何对象,所以里面的this在严格模式下是undefined,非严格模式下就变成window了
qq_40088298 2018-08-02
  • 打赏
  • 举报
回复
====this
this代表的是一个对象,this所在环境的对象
this一般出现在函数的执行体内部,代表的是函数的持有者(方法持有者)
如果this出现在非函数内部,代表的是window对象
this最终代表的是调用者(new call apply this可以改变,代表的是调用)
总结:this就是离它最近的function修饰的持有对象
最近: 不是哥哥,是父级
修饰: 只有对象的成员是这个函数时,才叫持有者


var name = "The Window";
var object = {    
name: "My Object",
    getNameFunc: function() {      
return function() {        
return this.name;      
};     
}
};
alert(object.getNameFunc()());
解析:object.getNameFunc()()
首先是object.getName() ===》调用这个方法,得到一个返回值:
function() {        
return this.name;      
};
===>此时返回的函数暴露在了window环境里面,因为你是在window的环境下调用的所以它返回的函数也会暴露在window环境下;
我们在往下分析:
object.getNameFunc()()
由于object.getName() 返回了一个函数到window下,所以我们此时可以写成
(window.这个函数)==》 function() {        
return this.name;      
}();

this就是离它最近的function修饰的持有对象,此时持有它的就是window
所以我们就这里的this就是window对象
运行这段函数 function() {        
return this.name;      
}
我们就可以得到 alert出 : The Window
你的代码2我运行弹出来的是空白,检查下你第二段代码是否正确
丰云 2018-08-01
  • 打赏
  • 举报
回复
要么就是代码敲错了,
代码二里是 return that.name
丰云 2018-08-01
  • 打赏
  • 举报
回复
呵呵。。。

貌似代码二啥都不输出哦。。。。

骚年,你是不是没有清空缓存,就接着运行代码二了。。。。

qq_36245239 2018-07-31
  • 打赏
  • 举报
回复
。。话说代码二不会报错么。。 全局 window.name 貌似是空呀。。 应该会弹出空白。。。
如果是that写错了的话 很正常 that=object;
rebooting_now 2018-07-31
  • 打赏
  • 举报
回复
object.getNameFunc()执行完成之后返回function(){return this.name;}; 此时的this指向是object对象 然后又执行了一次 , 现在是一个函数立即执行 this指向window
讨厌走开啦 2018-07-25
  • 打赏
  • 举报
回复
代码一的object.getNameFunc()执行后this已经不再指向object,而是全局作用域,所以输出是The Window;

代码二把全局作用域的引用放到that里了,所以object.getNameFunc()执行以后this并没有被改掉,还是指向object,所以输出是My Object。
似梦飞花 2018-07-25
  • 打赏
  • 举报
回复
其实等同
var _=object.getNameFunc()
_()
所以this是window
似梦飞花 2018-07-25
  • 打赏
  • 举报
回复
代码2
return this.name;
应该是
return that.name;

87,838

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧