• 技术文章 >后端开发 >php教程

    一道小面试题

    2016-06-06 20:11:20原创359
    var obj1 = {name : "blue",fn : function(){alert(this.name);}};
    var newFunction = obj1.fn;
    newFunction();

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

    回复内容:

    var obj1 = {name : "blue",fn : function(){alert(this.name);}};
    var newFunction = obj1.fn;
    newFunction();

    为啥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是当前{}吧

    玩一下这个就清楚了

    
    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();
        
        

    function 有自己的 name

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

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

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:php
    上一篇:mysql_close关闭哪个连接标识 下一篇:javascript - 有没有获取手机品牌型号的开源js/php类库
    Web大前端开发直播班

    相关文章推荐

    • PHP程序61条面向对象分析设计的经验小结_PHP• 用PHP来写记数器(详细介绍)_PHP• 使用PHP批量生成随机用户名_PHP• 让你的PHP引擎全速运转_PHP• Php利用java解析xml_PHP

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网