V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yasumoto
V2EX  ›  京东

一个京东前端面试题

  •  1
     
  •   yasumoto · 2019-04-18 10:36:28 +08:00 · 5200 次点击
    这是一个创建于 2051 天前的主题,其中的信息可能已经有所发展或是发生改变。
    var a = 1;
    (function a(){
    a = 2;
    console.log(a)})()

    问最后打印的结果
    27 条回复    2019-04-19 09:00:25 +08:00
    Floyder
        1
    Floyder  
       2019-04-18 10:39:23 +08:00
    rodjl
        2
    rodjl  
       2019-04-18 13:39:02 +08:00 via iPhone
    有大佬说一下吗?这个 a=2 作用到哪里去了
    Flobit
        3
    Flobit  
       2019-04-18 13:43:07 +08:00 via Android
    我还以为问 你觉得你能当东哥的兄弟吗? 😂
    rabbbit
        4
    rabbbit  
       2019-04-18 13:54:47 +08:00   ❤️ 3
    打印结果是 a 函数
    ---
    比如,当访问函数内的 foo 变量时,JavaScript 会按照下面顺序查找:
    当前作用域内是否有 var foo 的定义。
    函数形式参数是否有使用 foo 名称的。
    函数自身是否叫做 foo。
    回溯到上一级作用域,然后从 #1 重新开始。
    ---
    摘自 js 秘密花园
    rabbbit
        5
    rabbbit  
       2019-04-18 14:10:45 +08:00
    var a = 1;
    (function a(){
    ..'use strict'
    ..a = 2;
    ..console.log(a)}
    )()
    TypeError: Assignment to constant variable.
    JenJieJu
        6
    JenJieJu  
       2019-04-18 14:39:34 +08:00
    等价于:a1 和 a 代表不同指向;
    window.a = undefined;
    var a1 = 1;
    window.a = function (){ a1 = 2; console.log(a) }
    jishu541464750
        7
    jishu541464750  
       2019-04-18 14:51:19 +08:00
    @rabbbit #4
    @JenJieJu #6
    为什么在同一个作用域下(立即执行函数体内)
    赋值的 a ( a = 2 )和 console.log 的 a 的值不一样?
    rabbbit
        8
    rabbbit  
       2019-04-18 14:55:23 +08:00
    a = 2 和 console.log(a)是同一个 a.
    只不过 a = 2 没有生效,我也不明白为什么非严格模式下(a = 2)不会报错.
    改成严格模式的话 a = 2 会报错 TypeError: Assignment to constant variable.
    ayase252
        9
    ayase252  
       2019-04-18 14:59:37 +08:00 via iPhone
    https://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Operators/function

    看 named function expresssion 那一节。把其他值赋值给 name 也改变不了 name
    guyujiezi
        10
    guyujiezi  
       2019-04-18 15:03:11 +08:00
    function a(){a = 2;console.log(a)}
    a()

    又是另一番景象
    JenJieJu
        11
    JenJieJu  
       2019-04-18 15:06:36 +08:00
    @jishu541464750 函数里面 a = 2 的 a 指向 外部 var 的 a,console.log 的 a 指向 windows 的 a ;
    maichael
        12
    maichael  
       2019-04-18 15:21:56 +08:00
    ```
    var a = 1;
    var b;
    (function a(){
    a = 2;
    b=a;
    console.log(a)})();
    console.log(b)
    ```
    HuHui
        13
    HuHui  
       2019-04-18 15:25:06 +08:00 via Android   ❤️ 2
    这种题除了让你知道 js 很烂,还有什么用
    Vegetable
        14
    Vegetable  
       2019-04-18 15:28:20 +08:00   ❤️ 1
    兄弟不会出这种题目为难兄弟.
    Jossss
        15
    Jossss  
       2019-04-18 15:29:00 +08:00
    @HuHui 还有面试的时候有用
    troywith77
        16
    troywith77  
       2019-04-18 15:29:54 +08:00 via Android
    a 函数内部的 a 指向函数本身,a=2 不生效,所以打印 a 本身
    plqws
        17
    plqws  
       2019-04-18 15:31:16 +08:00   ❤️ 3
    神烦这种莫名其妙的傻屌面试题,能写出这种代码的弱智能开除一个是一个,越是小公司越是喜欢搞这种幺蛾子
    SakuraKuma
        18
    SakuraKuma  
       2019-04-18 15:44:40 +08:00
    因为 function 的 Identifier 是 CreateImmutableBinding 出来的。
    最上面的 var a=1;就是个混淆视听。
    rabbbit
        19
    rabbbit  
       2019-04-18 15:44:42 +08:00
    找到为什么不能修改 a 了

    看 es5 文档
    https://www.w3.org/html/ig/zh/wiki/ES5/%E5%87%BD%E6%95%B0%E5%AE%9A%E4%B9%89#FunctionExpression

    ```
    产生式 FunctionExpression : function Identifier ( FormalParameterListopt ) { FunctionBody } 的解释执行如下:

    1 令 funcEnv 为以运行中执行环境的 LexicalEnvironment 为参数调用 NewDeclarativeEnvironment 的结果。
    2 令 envRec 为 funcEnv 的环境记录项。
    3 以 Identifier 的字符串值为参数调用 envRec 的具体方法 CreateImmutableBinding(N)。// 注意这里,创建了一个不可变绑定

    ```
    zbinlin
        20
    zbinlin  
       2019-04-18 16:00:37 +08:00
    iMusic
        21
    iMusic  
       2019-04-18 16:48:44 +08:00
    (function a () {})

    这是个函数表达式,这个 a 就是函数名称,它的特点是作为函数体(作用域内)的本地变量,不能被修改,也不能被外部访问。
    zaul
        22
    zaul  
       2019-04-18 16:59:28 +08:00
    花里胡哨,捉起来霸死
    jin5354
        23
    jin5354  
       2019-04-18 17:06:39 +08:00
    还真是知识盲点
    具名函数表达式中函数 name 是不可被修改的,函数声明中函数 name 是可被修改的
    花里胡哨,下次我还忘
    1KN6sAqR0a57no6s
        24
    1KN6sAqR0a57no6s  
       2019-04-18 20:12:12 +08:00
    ```js
    function a() {
    console.log(a); // [Function: a]
    a = 100;
    console.log(a); // 100
    }
    a();
    console.log(a); // 100



    function b() {
    "use strict";
    console.log(b); // [Function: b]
    b = 100;
    console.log(b); // 100
    }
    b();
    console.log(b); // 100


    (function c() {
    console.log(c); // [Function: c]
    c = 100;
    console.log(c); // [Function: c]
    })();
    console.log(c); // ReferenceError: c is not defined


    "use strict";
    (function d() {
    console.log(d); // TypeError: Assignment to constant variable.
    d = 100;
    console.log(d);
    })();
    console.log(d); // ReferenceError: d is not defined
    ```
    1KN6sAqR0a57no6s
        25
    1KN6sAqR0a57no6s  
       2019-04-18 20:16:56 +08:00
    ```js
    var a = 100;
    var b = 999;

    (function a() {
    console.log(b); // 999 根据词法环境规则,可以拿到外层的 b 的值

    b = 888; // 也可以修改外层的 b 的值

    a = 200; // 非严格模式 && IIFE, 此时 a 的值无法被修改, 静默失败

    console.log(a); // [Function: a]

    })(); //并没有在全局环境声明函数 a,而是用表达式产生一段程序,立即执行

    console.log(a); // 100
    console.log(b); // 888
    ```
    rabbbit
        26
    rabbbit  
       2019-04-18 22:22:45 +08:00   ❤️ 1
    hahahasnoopy
        27
    hahahasnoopy  
       2019-04-19 09:00:25 +08:00 via Android
    刚学 js 的时候出这种题我觉得哇,好厉害,好神奇;现在只让我觉得 js 是个垃圾语言,每天在语言坑里面打转~
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3366 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 11:33 · PVG 19:33 · LAX 03:33 · JFK 06:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.