1
Floyder 2019-04-18 10:39:23 +08:00
|
2
rodjl 2019-04-18 13:39:02 +08:00 via iPhone
有大佬说一下吗?这个 a=2 作用到哪里去了
|
3
Flobit 2019-04-18 13:43:07 +08:00 via Android
我还以为问 你觉得你能当东哥的兄弟吗? 😂
|
4
rabbbit 2019-04-18 13:54:47 +08:00 3
打印结果是 a 函数
--- 比如,当访问函数内的 foo 变量时,JavaScript 会按照下面顺序查找: 当前作用域内是否有 var foo 的定义。 函数形式参数是否有使用 foo 名称的。 函数自身是否叫做 foo。 回溯到上一级作用域,然后从 #1 重新开始。 --- 摘自 js 秘密花园 |
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. |
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) } |
7
jishu541464750 2019-04-18 14:51:19 +08:00
|
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. |
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 |
10
guyujiezi 2019-04-18 15:03:11 +08:00
function a(){a = 2;console.log(a)}
a() 又是另一番景象 |
11
JenJieJu 2019-04-18 15:06:36 +08:00
@jishu541464750 函数里面 a = 2 的 a 指向 外部 var 的 a,console.log 的 a 指向 windows 的 a ;
|
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) ``` |
13
HuHui 2019-04-18 15:25:06 +08:00 via Android 2
这种题除了让你知道 js 很烂,还有什么用
|
14
Vegetable 2019-04-18 15:28:20 +08:00 1
兄弟不会出这种题目为难兄弟.
|
16
troywith77 2019-04-18 15:29:54 +08:00 via Android
a 函数内部的 a 指向函数本身,a=2 不生效,所以打印 a 本身
|
17
plqws 2019-04-18 15:31:16 +08:00 3
神烦这种莫名其妙的傻屌面试题,能写出这种代码的弱智能开除一个是一个,越是小公司越是喜欢搞这种幺蛾子
|
18
SakuraKuma 2019-04-18 15:44:40 +08:00
因为 function 的 Identifier 是 CreateImmutableBinding 出来的。
最上面的 var a=1;就是个混淆视听。 |
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)。// 注意这里,创建了一个不可变绑定 ``` |
20
zbinlin 2019-04-18 16:00:37 +08:00
|
21
iMusic 2019-04-18 16:48:44 +08:00
(function a () {})
这是个函数表达式,这个 a 就是函数名称,它的特点是作为函数体(作用域内)的本地变量,不能被修改,也不能被外部访问。 |
22
zaul 2019-04-18 16:59:28 +08:00
花里胡哨,捉起来霸死
|
23
jin5354 2019-04-18 17:06:39 +08:00
还真是知识盲点
具名函数表达式中函数 name 是不可被修改的,函数声明中函数 name 是可被修改的 花里胡哨,下次我还忘 |
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 ``` |
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 ``` |
26
rabbbit 2019-04-18 22:22:45 +08:00 1
|
27
hahahasnoopy 2019-04-19 09:00:25 +08:00 via Android
刚学 js 的时候出这种题我觉得哇,好厉害,好神奇;现在只让我觉得 js 是个垃圾语言,每天在语言坑里面打转~
|