js中函数作用域,作用域链,变量提升
Posted 无所不能的风
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于js中函数作用域,作用域链,变量提升的主要内容,如果未能解决你的问题,请参考以下文章