ch02 函数作用域和块作用域
JavaScript具有基于函数的作用域:每声明一个函数都会为其创建一个气泡,其他结构不会创建作用域气泡。
函数作用域的含义:属于这个函数的全部变量都可以在整个函数的范围内使用以及服用
隐藏内部实现
在任意代码片段外部添加包装函数,可以将内部的变量和函数定义‘隐藏’起来,外部作用域无法访问包装函数内部的任何内容
var a = 2;
function foo() {
var a =3;
console.log(a); // 3
}
foo();
console.log(a);
如何创建一个自执行或称之为不污染全局作用域的函数???
var a = 2;
(function foo() {
var a = 3;
console.log(a); // 3
})();
console.log(a); // 2
匿名和具名
setTimeout(function() {
console.log('I waited 1s !');
}, 1000);
称之为匿名函数表达式,function() ... 没有名称表示符号。函数表达式可以匿名
匿名函数的缺点
- 匿名函数在栈追踪中不会显示出有意义的函数名称,难以调试;
- 如果没有函数名称,当函数需要引用自身时只能使用已经过期的arguments.callee引用,eg: 在递归中,另一个函数需要引用自身的例子,是在事件触发之后事件监听器需要解绑自身;
- 匿名函数省略对代码可读性/可理解性
总的来说,给函数表达式命名是一个最佳实践:::
setTimeout(function timeoutHandler() {
console.log('I waited 1s!');
}, 1000);
立即执行函数表达式(自执行函数)- Immediately Invoked Function Expression
var a = 2;
(function foo() {
var a = 3;
console.log(a); // 3
})();
console.log(a); // 2
try/catch
try/catch的catch分局会创建一个块作用域,其中声明的变量仅仅在catch内部生效
try {
undefined(); // 执行一个非法操作来强制制造一个异常
} catch(err) {
console.log(err); // 能够正常执行
}
console.log(err); // ReferenceError: err not found!
使用let进行声明不会在块作用域中进行变量提升。声明的代码被运行之前,声明并不‘存在’
{
console.log(bar); // ReferenceError!
let bar = 2;
}
学而不思则罔,思而不学则殆!

浙公网安备 33010602011771号