Heim  >  Artikel  >  Backend-Entwicklung  >  一道小面试题

一道小面试题

WBOY
WBOYOriginal
2016-06-06 20:11:20936Durchsuche

<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第三章的环境模型你就全懂了

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn