• JavaScript 题目(作用域)


    var length = 10
    function fn(){
        alert(this.length)
    }
    
    var obj = {
        length: 5,
        method: function(fn) {
            fn() // ?
            arguments[0]() // ?
        }
    }
    obj.method(fn)
    

     这是今天在群里看到的一个题目,很多人来作答,但是大家一开始都答错了,什么答案都有。

    我先来公布一下正确答案:10,1

    然后我来解释一下为什么:

    首先定义了一个var length=10;这没什么好说的

    然后声明一个函数function fn(){ alert(this) alert(this.length) }

    在这一步你执行fn()会弹出10,因为length是定义在window下,fn也是在window下调用,this指向window;

    然后是定义一个对象:var obj = { length: 5, method: function(fn) { fn() // ? arguments[0]() // ? } }

    对象里也有一个length属性和一个method的方法:

    最后调用了对象下的method的方法;

    首先会跑function(fn) { fn() // ?  }我们看到fn被作为参数传递进来,然后执行fn(),那么在执行fn()的时候,就是执行的外面的fn而外面的fn是在window下的,this是指向window,他自然也只能找到window下的length属性;找不到obj下的length

    然后跑function(fn) {arguments[0]() // ? }我们看到fn被作为参数传递进来,然后执行这个参数,这是的this指向的是这个参数,那么参数的length为1,结果就是1

    如果你加一个参数obj.method(fn,“heihei”)这样第二次的结果就是2了,

    如果你还不是很理解那么在fn函数里alert(this)一下,或许就能明白了

     以上为个人理解,如有纰漏或错误忘留言指正。

  • 相关阅读:
    近来几个有用的网站
    军事视频网站
    美军武器命名
    区块链的五个关键要素
    处理多媒体的两个重要工具
    Python re模块将字符串分割为列表
    Python 自动刷新网页
    selenium:chromedriver与chrome版本的对应关系
    怎么批量删除QQ空间说说?
    ssm获取数据库名称
  • 原文地址:https://www.cnblogs.com/coolslider/p/5315290.html
Copyright © 2020-2023  润新知