一个京东前端面试题

2019-04-18 10:36:28 +08:00
 yasumoto
var a = 1;
(function a(){
a = 2;
console.log(a)})()

问最后打印的结果
5008 次点击
所在节点    京东
27 条回复
Floyder
2019-04-18 10:39:23 +08:00
rodjl
2019-04-18 13:39:02 +08:00
有大佬说一下吗?这个 a=2 作用到哪里去了
Flobit
2019-04-18 13:43:07 +08:00
我还以为问 你觉得你能当东哥的兄弟吗? 😂
rabbbit
2019-04-18 13:54:47 +08:00
打印结果是 a 函数
---
比如,当访问函数内的 foo 变量时,JavaScript 会按照下面顺序查找:
当前作用域内是否有 var foo 的定义。
函数形式参数是否有使用 foo 名称的。
函数自身是否叫做 foo。
回溯到上一级作用域,然后从 #1 重新开始。
---
摘自 js 秘密花园
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
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
2019-04-18 14:51:19 +08:00
@rabbbit #4
@JenJieJu #6
为什么在同一个作用域下(立即执行函数体内)
赋值的 a ( a = 2 )和 console.log 的 a 的值不一样?
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
2019-04-18 14:59:37 +08:00
https://developer.mozilla.org/en-US/docs/web/JavaScript/Reference/Operators/function

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

又是另一番景象
JenJieJu
2019-04-18 15:06:36 +08:00
@jishu541464750 函数里面 a = 2 的 a 指向 外部 var 的 a,console.log 的 a 指向 windows 的 a ;
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
2019-04-18 15:25:06 +08:00
这种题除了让你知道 js 很烂,还有什么用
Vegetable
2019-04-18 15:28:20 +08:00
兄弟不会出这种题目为难兄弟.
Jossss
2019-04-18 15:29:00 +08:00
@HuHui 还有面试的时候有用
troywith77
2019-04-18 15:29:54 +08:00
a 函数内部的 a 指向函数本身,a=2 不生效,所以打印 a 本身
plqws
2019-04-18 15:31:16 +08:00
神烦这种莫名其妙的傻屌面试题,能写出这种代码的弱智能开除一个是一个,越是小公司越是喜欢搞这种幺蛾子
SakuraKuma
2019-04-18 15:44:40 +08:00
因为 function 的 Identifier 是 CreateImmutableBinding 出来的。
最上面的 var a=1;就是个混淆视听。
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
2019-04-18 16:00:37 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/556295

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX