# 11-04
参考:
进度:
在 V8(Chrome,Edge,Opera)中,如果从代码中可以明显看出有未使用的外部变量,那么就会将其删除,这会导致此类变量在调试中不可用。
let value = "Surprise!"; function f() { let value = "the closest value"; function g() { debugger; // 在 console 中:输入 alert(value); Surprise! } return g; } let g = f(); g();1
2
3
4
5
6
7
8
9
10
11
12
13
14所有的
var声明都是在函数开头处理的(“提升”),可以在任何地方引用它们。但是在它们被赋值之前都是 undefined,赋值操作不会被“提升”。function sayHi() { alert(phrase); // undefined var phrase = "Hello"; } sayHi();1
2
3
4
5
6
7在浏览器中,除非使用 modules,否则使用
var(而不是let/const)声明的全局函数和变量会成为全局对象的属性。var gVar = 5; alert(window.gVar); // 5(成为了全局对象的属性)1
2
3可以把函数当作对象,在它里面存储属性,但是这对它的执行没有任何影响。变量不是函数属性,反之亦然。它们之间是平行的。
函数对象属性
name是“上下文命名”的,如果函数自己没有提供,那么在赋值中,会根据上下文来推测一个。若无法推测则为空。函数对象属性
length为函数定义时的入参的个数。Rest 参数不参与计数。如果函数是通过函数表达式的形式被声明的,并且附带了名字,那么它被称为命名函数表达式(Named Function Expression)。这个名字可以用于在该函数内部进行自调用,例如递归调用等。它在函数外是不可见的。
let sayHi = function func(who) { if (who) { alert(`Hello, ${who}`); } else { func("Guest"); //通过内部名 func 调用自己 } }; let welcome = sayHi; sayHi = null; //原变量被修改 welcome(); // Hello, Guest(嵌套调用仍然有效,如不使用 NFE 则报错)1
2
3
4
5
6
7
8
9
10
11
12
13
14
15