作用域

75 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

周末不愉快。昨天是噩梦,简直是心理阴影。

补充昨日更新的原型链,没有说到更深的链上,先举个栗子,看一段代码:

function Fn(){
this.a=1;
this.b=2;
this.getA=function(){
    console.log(this.a);
    }
}
//原型对象
Fn.prototype.getA=function(){
console.log(this.a);
}
Fn.prototype.getB=function(){
console.log(this.b);
}
//实例
let f1 = new Fn()
let f2 = new Fn()

分析以下代码会输出什么:

f1.getA === f2.getA
f1.getB === f2.getB
f1.__proto__.getB === Fn.prototype.getB
f1.__proto__.getA === f2.getA
f1.getA === Fn.protyotype.getA

分析完了嘛,那我来画图看一下。

image.png

那很快(画了10分钟)得出结果:

f1.getA === f2.getA//false
f1.getB === f2.getB//true
f1.__proto__.getB === Fn.prototype.getB //true
f1.__proto__.getA === f2.getA //false
f1.getA === Fn.protyotype.getA //false

补充了一下object与function。结束。

正文:

作用域:

作用域是指程序源代码中定义变量的区域。作用域规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。JavaScript采用词法作用域,也就是静态作用域

一个栗子:

var a = 1;
function f1(){
    console.log(a); //输出什么
}
function f2(){
    var a = 2;
    console.log(a); //2
    f1()
}
f2();

因为JavaScript采用静态作用域,所以先执行f1函数,打印a时先在局部寻找是否有局部变量a,有的话则打印输出,没有的话则查找上一层的代码。即打印1

如果JavaScript采用动态作用域呢,也先执行f1函数,依然是打印a时在局部寻找是否有局部变量a,有的话则输出a的值,没有的话就从 调用f1的作用域,也就是f2函数的內部查找变量a,即打印2。

一个栗子:

var scope = "global scope";
function checkscope(){
    var scope = "local scope";
    function f(){
        return scope;
    }
    return f();
}
checkscope();

同理,输出:local scope.

明天是上班的周一,但我要成为一名自由人了。

暗中窃喜。

哦对了,如果我写错了请指出,但是不要骂我。