由3道题来分析js中的函数作用域,作用域链,变量提升

摘要:其实在内部函数执行时,无论这个判断是否成立,都会对声明变量进行提升;在js的非严格模式下:函数的实参集合与形参变量存在‘映射关系’,不管其中谁改变了,另外一个都会跟着改变

第一题:

var foo = 1
function bar(){
    if(!foo){
        var foo = 10;
    }
    console.log(foo)
}
bar()

这道题大家会误认为是1

其实在内部函数执行时,无论这个判断是否成立,都会对声明变量进行提升,所以var foo = undefined,所以在内部判断,因为undefined是false,取反就是true,执行var foo = 10,所以:

最后答案就是10

 

第二题:

var n = 0
function a(){
    var n = 10
    function b(){
        n++
        console.log(n)
    }
    b()
    return b
}
var c = a()
c()
console.log(n

我直接叙述解题步骤了:

先声明变量,函数声明提前,执行a()函数,在a函数里又声明了函数b,调用函数b并且将b返回,n++将函数a里的n的值变为11,打印n,所以第一个n是11,

这时候将函数b返回,并且执行,因为这时还是在函数a内部执行,n已经是11,再n++,所以n = 12,

最后一个是n是0,函数的私有作用域无法访问

所以最终结果是11,12,0

 

第三题:

var a = 4
function b(x,y,a){
    console.log(a)
    arguments[2] = 10
    console.log(a)
}
a = b(1,2,3)
console.log(a)

在js的非严格模式下:函数的实参集合与形参变量存在‘映射关系’,不管其中谁改变了,另外一个都会跟着改变

在js的严格模式下:arguments实参集合和形参变量的映射关系被切断了,相互之间互不干扰

如果没有返回值则是undefined

所以结果是3,10,undefined


本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!

链接: https://shenqiku.cn/article/FLY_1853