携手创作,共同成长!这是我参与「掘金日新计划 · 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
分析完了嘛,那我来画图看一下。
那很快(画了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.
明天是上班的周一,但我要成为一名自由人了。
暗中窃喜。
哦对了,如果我写错了请指出,但是不要骂我。