网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月26日漏签0天
javascript吧 关注:269,190贴子:906,493
  • 看贴

  • 图片

  • 吧主推荐

  • 游戏

  • 32回复贴,共1页
<<返回javascript吧
>0< 加载中...

以此 被面试官秒杀

  • 只看楼主
  • 收藏

  • 回复
  • AyleinOter
  • switch
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

why \("▔□▔)/


  • 95黑妹L
  • Boolean
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
你想表达什么


2025-08-26 07:00:51
广告
不感兴趣
开通SVIP免广告
  • kandgin
  • for
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
obj的两个属性 show 和 make 都是function类型 所以在调用的时候要加“()”
so obj.show() obj.make()


  • 说话梦中
  • trycatch
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
因为虽然obj.make本身是一样的,但两个this的值不一样


  • AyleinOter
  • switch
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个题目大概考察3个点
1. 匿名函数中this指针的指向
2. 自执行函数
3. 闭包
obj = {
show: function() {
console.log(this);
},
make: function() {
return this;
}
}
可以推到
(obj.make) = (function(){return this;})
(obj.make = obj.make) = (obj.make = function(){return this;}) = (function(){return this;})
所以看起来 (obj.make) = (obj.make = obj.make) = (function(){return this;})
所以 (function(){return this;})() 怎么看都像是一个闭包 this 指向 window
但是执行的时候
其实
(obj.make)() = (obj.make()) = obj.make(); //更像是自执行函数
而
(obj.make = obj.make)() = (function(){return this;})(); //更像是闭包
可见 (obj.make)() 中的 this 指向了 obj 。。 这个如何理解


  • AyleinOter
  • switch
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
想的太复杂了其实就是表达式返回值的问题 诸如
var a = {a: "a"};
var b, c = (b = a);
一般来说 (b = a) 的表达式执行顺序是 首先 用 a 给 b 赋值 然后 返回 等号右边的值
所以 (obj.make = obj.make) 返回的是一个没有对象引用函数
而 (obj.make)() 是 obj.make() 的另一种写法
所以返回的 this 不同


  • 噢my嘎丿
  • false
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不错


  • 这个名字牛
  • ifelse
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看红宝书,上面有这个例子。


2025-08-26 06:54:51
广告
不感兴趣
开通SVIP免广告
  • Oo桀王子oO
  • trycatch
    9
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不得了


  • 孤独但不沉沦
  • true
    4
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
欢迎javascript新手加入群398223220,只交流javascript学习经验,群内分享妙味课堂javascript全套视频,js入门书籍


  • mypcluna
  • Boolean
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
(obj.make)()
这种写法并不会丢失函数的this,因为圆括号表达式的求值结果就是括起来的子表达式的求值结果。但是,一旦把函数用于赋值,this就会丢失,比如:
var m;
(m = (obj.make))();
严格模式下,this是null,非严则是全局对象。
那个,给函数绑定this,这个你会吧?


  • AyleinOter
  • switch
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
@mypcluna 如果把 (obj.make = obj.make)(); 等号左边的 obj.make 当成一个变量 确实很容易理解。
似乎被 等号左边的 obj.make 骗了。
这个例子可能更直观一些。。

new A(); 执行时 (this.show = b.show)(); 可以理解为
首先 this.show = b.show; //此时 this.show 被赋值为一个函数
然后执行 (this.show)();
但是在执行 (this.show = b.show)(); 的 (this.show)(); 时
感觉 this.show 函数的 this 指针还没有替换成 A 就被执行了
所以返回了 window 对象
所以感觉 (this.show = b.show)(); 和 直接 (this.show)(); 似乎有本质的不同
//不是说过 (this.show)(); 是 this.show(); 的另一种写法吗 0 0~
//(this.show = b.show) 是赋值表达式 (this.show) 是匿名函数表达式 ?
一个等号引起的血案
所以 "把函数用于赋值,this就会丢失" 这个简单明了。
//this就会丢失 应该理解为 等号左边的 this.show 的 this 指针丢失 ?
这个问题有点钻牛角尖 但是仅限于 (this.show = b.show)(); 这种情况。
分步运行时 this.show 的 this 指针完全没有问题。
也算是了了一桩心事 (握抓~


  • 闯95
  • null
    2
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
看懂了,丫的就是引用对象有没有定义的问题,这样的写法害得我想看一个小时,看懂之后原来是那么的简单


  • 冥芽
  • switch
    6
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

@AyleinOter @mypcluna


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 32回复贴,共1页
<<返回javascript吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示