var a = 10,
b = 20;
function fn(x){
var a =100;
c= 300;
console.log('fn()',a,b,c,x)
// 100 20 300 10
function bar(x) {
var a = 1000;
d=400;
console.log('bar()',a,b,c,d,x)
//1000 20 300 400 100
//1000 20 300 400 200
}
bar (100);
bar (200);
}
fn(10);
全局作用域,每个函数都会创建自己的作用域,作用域在函数定义的时候已经确定,作用域是静态的,函数定义后一直存在,且不再变化。
作用域链:从内到外,查找变量是沿着作用域查找,如果都找到全局作用域链,还找不到就抛出异常。
面试题:
var x= 10;
function fn(){
console.log(x)
}
function show(f){
var x=20;
f();
}
show(fn);
结果是10,因为作用域在定义好的时候就已经确定了,调用f()就是调用fn(),在fn()函数中找不到x变量,但是在全局作用域中有x=10
面试题:
var obj = {
fn2:function(){
console.log(this.fn2);
console.log(fn2);
}
}
obj.fn2();
this.fn2是可以调用成功的,但是fn2是不行的,会根据作用域链去寻找,一直找不到fn2,然后报错。
本文介绍了JavaScript中的作用域概念,强调作用域在函数定义时已确定,并通过静态的作用域链查找变量。示例展示了函数内部如何访问全局变量,以及`this`关键字在对象方法中的应用。在面试题中,解释了为何`fn2`在对象方法内无法直接调用,而`this.fn2`可以成功的原因。
982

被折叠的 条评论
为什么被折叠?



