• #FUNCTION#CALL对象中的函数内作用域问题.md


    记录今天在学习 FUNCTION#APPLY #CALL #BING 偶然遇到的一个之前没有注意到的问题。

    我将其成为对象中的函数作用于问题, 确切的说,对象中函数的this 指向问题。

    我尝试执行以下代码:

    let name = 'jay';
    let age = 25;
    let obj = {
        name: "tom",
        age: 28,
        func: function() {
            console.log(this.name, '--', this.age);
        }
    }
    obj.func.call(null)//undefined --  undefined
    

    这段代码中,我在测试通过call 将一个函数对象中的 函数 thiscall首个参数(即传入的this) 不指向时,应当默认指向全局作用域的场景。 结果遇到了输出并不是期望的:

    jay -- 25
    

    (在浏览器环境下 能取到 name='jay',age=25 。)但是在Node中执行结果为undefined

    这就很奇怪了 - -

    后来在MDN上再看了一下文档。 发现漏掉了这一句:

    注意:在严格模式下,this 的值将会是 undefined。见下文。

    请注意,this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 nullundefined 时会自动替换为指向全局对象,原始值会被包装。

    https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Function/call

    而Node 中,默认是以严格模式执行的,因此, Node中取不到,但是浏览器环境下能取到,验证方法也很简单,加上"use strict" 在浏览器中跑一下就知道了,我是了一下确实如此。

    另外,我发现, 通过letvar 关键字,在这段代码中,也会有不同的表现。
    同在浏览器,非严格模式下, 使用var 关键字能够取到,但是通过let 关键字则取不到。

    出现这样的情况,在《高程》 中也找到了解释:

    所有通过var 定义的全局变量和函数都会成为window对象的属性和方法。 使用letconst 的顶级声明不会定义在全局上下文中。

    @《高级程序设计 4.2 - paragraph 2》

    本文关联文章为 :#浅析 JavaScript ES6 call(). apply(), bind()

  • 相关阅读:
    spring事务
    事务理解
    zookeeper总结
    maven项目怎样将本地jar包打进去
    applicationcontext理解使用
    servlet 中getLastModified()
    Findbug插件静态java代码扫描工具使用
    上行短信/下行短信
    zookeeper基本原理
    git分支的合并
  • 原文地址:https://www.cnblogs.com/jaycethanks/p/14678650.html
Copyright © 2020-2023  润新知