javascript - 这段代码为什么弹出undefined,求详细注释
PHPz
PHPz 2017-04-11 12:34:51
[JavaScript讨论组]
var obj ={
    a:1,
    b:function () {
         alert(this.a)
}}; 
var fun =obj.b; 
fun();


  

还有下面这段代码,为什么会弹两次

 var obj ={
    a:alert(1),
    b:(function(){alert(2);}()) 
}; 
var fun =obj.b; 
fun();

只引用obj.b,为什么obj.a也会弹出来

PHPz
PHPz

学习是最好的投资!

全部回复(5)
PHP中文网

this的行为有时候会显得极其诡异,让人感到困惑,但只需要记住 this的值要等到代码真正执行时才能确定
同时this的值具体有以下几种情况:

  1. new 调用时指的是被构造的对象

  2. callapply调用,指向我们指定的对象

  3. 对象调用,如执行obj.b()this指向obj

  4. 默认的,指向全局变量window(相当于执行window.fun())

这样看来,当你执行fun()的时候,以上1,2点均不满足。
第3点,因为this是运行时确定的,而我们执行fun(),等同于windown.fun()(与obj没有任何关系),自然的this指向window,而window没有定义变量a,结果是undefined

阿神

记住一点,this总是指向调用其函数的对象。fun()可理解为全局对象调用,即window.fun(),此时全局对象上a没有定义。

伊谢尔伦

this的指向看函数执行的时侯的部分。this执行的时候是fn执行,前边没有.所以this指向window,而在全局作用域下没有a这个属性,所以是undefined。

高洛峰

1.fun是什么 。是function(){alert(this.a)}。直接调用this指向window。window.a是undefined.
2.你把除对象声明外的语句都去掉再看看。对象字面量声明的时候你直接调用了alert函数。跟后面的引用没关系。

PHP中文网

第一个fun是在全局作用域下被调用的,此时this指向的就是全局,但是全局并没有定义a。
第二个要知道声明变量的时候是先要执行符号右边的然后才对左边的进行赋值(这里可能说的不是很对),你可以看一下你不知道的JS上篇,里面有解释

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号