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

一个京东前端面试题

  •  1
     
  •   yasumoto 2019-04-18 10:36:28 +08:00 5622 次点击
    这是一个创建于 2375 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 作用到哪里去了
    YanSep
        3
    YanSep  
       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
    MzM2ODkx
        21
    MzM2ODkx  
       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     Solana     2799 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 06:58 PVG 14:58 LAX 23:58 JFK 02:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86