1.词法作用域
- 词法作用域:也称为静态作用域,JavaScript的作用域模型。
- 动态作用域:相对”冷门“,如Bash脚本。
var name = 'xiuyan';
function showName() {
console.log(name);
}
function changeName() {
var name = 'BigBear';
showName();
}
changeName(); // xiuyan
- 在showName 函数的函数作用域内查找是否有局部变量 name。
- 发现没有找到,于是根据书写的位置,查找上层作用域(全局作用域),找到name的值是xiuyan。
2.修改词法作用域
JavaScript 在书写阶段(解析阶段)对作用域进行了划分,如果想要把划分好的作用域改掉——eval和with。
eval
function showName(str) {
eval(str)
console.log(name)
}
var name = 'xiuyan'
var str = 'var name = "BigBear"'
showName(str) // 输出 BigBear
eval参数传入的入参是一个字符串,会把这段字符串的内容当作一段js代码插入被调用的那个位置,即:
function showName(str) {
var name = "BigBear
console.log(name)
}
with
function changeName(person) {
with(person) {
name = 'BigBear'
}
}
var me = {
name: 'xiuyan',
career: 'coder',
hobbies: ['coding', 'footbal']
}
changeName(me)
console.log(name) // 输出 'BigBear'