首页 > 后端开发 > php教程 > 一道小面试题

一道小面试题

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
发布: 2016-06-06 20:11:20
原创
1025 人浏览过

<code>var obj1 = {name : "blue",fn : function(){alert(this.name);}};
var newFunction = obj1.fn;
newFunction();</code>
登录后复制
登录后复制

为啥alert的是空,确不是undefined ?

回复内容:

<code>var obj1 = {name : "blue",fn : function(){alert(this.name);}};
var newFunction = obj1.fn;
newFunction();</code>
登录后复制
登录后复制

为啥alert的是空,确不是undefined ?

(1)this跟调用者有关,而不是和定义的位置有关,var newFunction = obj1.fn;这句话创建了fn的一个引用叫newFunction,而不是obj.fn,这里原来fn就脱离了obj1,所以调用的作用域是window,这样就读不到obj1.name了
(2)name在window中有定义,如果在跨域中经常会修改这个属性,所以window.name存在而且为空,不是undefined

建议阅读you don't know js这一系列书,特别讲解了this作用域的四个判据,其中有例子就提到了什么写法会导致类中的函数脱离原有作用域

js 的this是当前{}吧

玩一下这个就清楚了

<code>
var obj1 = {name: 'blue', fn : function(){alert(this.name);}};
 
obj1.fn();
    
var newFunction = obj1.fn;
newFunction();
    
//----------------------------------------------------
    
var obj2 = {here_do_not_use_name_as_var_name: 'blue',fn : function(){alert(this.here_do_not_use_name_as_var_name);}};
 
obj2.fn();
    
var newFunction2 = obj2.fn;
newFunction2();
    
    </code>
登录后复制

function 有自己的 name

see also: http://www.w3schools.com/js/js_reserved.asp

去看下SICP第三章的环境模型你就全懂了

相关标签:
php
来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
怎么学好php
来自于 1970-01-01 08:00:00
0
0
0
PHP扩展intl
来自于 1970-01-01 08:00:00
0
0
0
php数据获取?
来自于 1970-01-01 08:00:00
0
0
0
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板