【JS基础】关于作⽤域和作⽤域链的基础⾯试题解答
⽬录
前⾔
也没啥好说的,就拉⼏个关于作⽤域和作⽤域链的基础⾯试题出来遛遛,解答过程有误还望指出。基础知识默认掌握,JS初学者先别看哇。var和let的作⽤域问题
这俩区别就不说了,直接上⼩题
关于var
var name ='hello';
(function(){
if(typeof name ==='undefined'){
var name ='jack';
console.log("true"+name);
}else{
console.log('false'+name);
}
})()
// 问:控制台打出啥?
// 解答
var name ='hello';
(function(){
var name // undefined
if(typeof name ==='undefined'){// true
var name ='jack';// var声明的变量是函数级作⽤域,变量提升到外部
console.log("true"+name);
}else{
console.log('false'+name);
}
})()
关于let
function demo(){
let n=2;
if(true){
let n =1;
}
console.log(n);//输出⼏?如果改成var就是输出啥
}
demo();
作⽤域有⼏种类型
全局作⽤域
函数作⽤域
块级作⽤域
简单的作⽤域链题
通过作⽤域链获取到的变量可以被叫做⾃由变量
这⾥⾸先要强调⼀个很重要的概念:⾃由变量的查,是在函数定义的地⽅,向上级作⽤域查,不是在执⾏的地⽅!
咱们拿闭包来举例(例⼦来源于慕课⽹):
// 函数作为返回值
function create(){
const a =100
return function(){
console.log(a)
}
}
const fn =create()
const a =200
fn()// 100
// 函数作为参数被传递
function print(fn){
const a =200
fn()
}
const a =100
function fn(){
console.log(a)
}
print(fn)// 100
好了,记住这个重要的知识点后接着看题⽬。
例题⼀
var bar =1;
function test(){
console.log(bar);//undefined 因为变量提升
var bar =2;
console.log(bar);//现在函数内部局部变量 2
}
test()const的作用
a = 1形式的作⽤域与作⽤域链判断
例题⼀
function test(){
console.log(bar);//因为作⽤域链,在局部中没有变量声明,js不知道bar是什么,直接报错 bar =2// js执⾏到这才能认识bar
}
test()
例题⼆
var f =true;
if(f===true){
var a =10;
}
function fn(){
var b =20;
c=30;// 这种没有声明的形式没有变量提升机制,js执⾏到了才认得
// 注意如果 var b = c =20 ,c也是个全局变量
}
fn();
console.log(a,c)// c是全局变量
console.log(b)// b是var声明的变量,为函数级作⽤域,所以报错
例题三
function fn(){
var a =10
window.a =20
console.log(a)
//因为作⽤域链,先本层的变量,再外部的,虽然window.a是在本层的,但是它是⼀个全局变量所以是的是本层的变量a = 10 }
例题四
function fn(){
var a =10
window.a =20
a =30//作⽤域链关系,先局部变量,到,修改值
console.log(this.a)//⽽这⾥打印的是全局变量 20
}
例题五
window.a =20
a =30//因为作⽤域链,先内部的变量,没有局部变量,有个全局window.a的,那就修改全局的
console.log(a)//局部变量没有,打印全局的 30
}
例题六
function fn(){
window.a =20
a =30//因为作⽤域链,先内部的变量,没有局部变量,有个全局window.a的,那就修改全局的
console.log(this.a)//此时this指window 30
}
例题七
function fn(){
window.a =20
a =30// 下⾯有局部变量的声明,变量提升,所以a=30 改的是局部的
var a
console.log(this.a)//20
}
例题⼋
var a =10
function fn(a){
alert(a)
a =20// 此时改的是参数a的值,不是修改全局变量
}
fn(30)//弹出30
alert(a)//弹出10
例题九
var a =10
function fn(){
alert(a)
a =20
}
fn()//因为作⽤域链,函数内不到变量声明,只能向函数外,弹出10
alert(a)//此时外部的a变量已经和函数内部关联了(也就是作⽤域链),所以a的赋值⽣效,弹出20;
未完待续~
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论