let a=10
let r=function a(){
a=20
console.log(a)
}
r()
console.log(a)
答案:第一个打印函数r 第二个打印10 不是很理解 哪位大神解释一下
let a=10
let r=function a(){
a=20
console.log(a)
}
r()
console.log(a)
function a(){
a=20
console.log(a)
}
10
由于函数r使用了命名函数表达式;那么这里的a 只是一个标识符只有在函数作用域中有效,在外面的作用域中无效;
所以函数体内a=20是无效的,因为不能给标识符再赋值;而下一句打印a,就相当于打印这个函数体;
因为r函数a=20是无效代码,最后直接打印a,就直接输出全局变量a的初始值10
采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。
因此,第一个console打印是函数作用域内的a 即函数a。第二个console打印的全局的a变量,因执行过r函数,所以此时全局a变量为20。
修正:对不起,我想当然了,没试着执行下就回答了,第二次确实不是20,搜了下资料,发现命名函数表达式里这个a相当于常量,所以赋值a=20是无效的,严格模式下则会报错
答案见一下代码注释
{//函数体1
let a = 10
let r = function a()
{//函数体2
a = 20
console.log(a)//打印的是函数体1内定义的a,即第一个打印20
}//函数体2 结束,此时函数体2定义的a内存已被释放
r()//输出20
console.log(a)//打印的是函数体1内定义的a,即10
}//函数体1结束
函数体1仅为示例,可为全局作用域。建议题主看一下有关作用域的知识。
输出: 20 10
let a = 10
let r = function a(){//这里如果不用a,直接function(),那么r()直接执行函数,即函数的执行结果给变量
a = 20
console.log('第一个',a)
}
console.log('r是什么?',typeof(r))
r()
console.log('第二个',a)//这里是作用域的原因,a=10作用域在window下,let 定义的a=20的作用域在函数a下,外部无法访问