Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 你能澄清一下这种行为吗? 案例1:_Javascript_Hoisting - Fatal编程技术网

Javascript 你能澄清一下这种行为吗? 案例1:

Javascript 你能澄清一下这种行为吗? 案例1:,javascript,hoisting,Javascript,Hoisting,我以为函数logIt()中的文本将被提升到函数顶部,并将打印未定义的 案例2: 这一个按预期打印未定义的。有人能解释一下为什么在case1中,我们得到了外部的值吗?因为内部变量text被移动到函数的开头。但只有它的名称部分: var text = 'outside'; function logIt(){ var text; console.log(text); text ='inside'; } logIt(); //prints undefined 案例1记录为“外部

我以为函数
logIt()
中的
文本将被提升到函数顶部,并将打印
未定义的

案例2:
这一个按预期打印未定义的
。有人能解释一下为什么在
case1
中,我们得到了
外部的值吗?

因为内部变量
text
被移动到函数的开头。但只有它的名称部分:

var text = 'outside';
function logIt(){
    var text;
    console.log(text);
    text ='inside';
}
logIt(); //prints undefined

案例1记录为“外部”,因为
text
logIt
周围范围内的一个变量,因此可在
logIt
中访问。您可以在
console.log
调用之后按词汇重新分配
text
。因此,不考虑这种重新赋值。

由于提升,内部变量
text
被移动到函数的开头。但只有它的名称部分:

var text = 'outside';
function logIt(){
    var text;
    console.log(text);
    text ='inside';
}
logIt(); //prints undefined

案例1记录为“外部”,因为
text
logIt
周围范围内的一个变量,因此可在
logIt
中访问。您可以在
console.log
调用之后按词汇重新分配
text
。因此,这种重新分配没有被考虑。

被提升的是变量声明,而不是分配

在第一个函数中,您仅在调用
console.log
后覆盖
text
的值,但没有将其他
text
引入函数的本地范围

在第二种情况下,您将引入一个新的
文本
变量,该变量是本地变量(并按预期初始化为
未定义
),由于变量提升,实际的
变量文本
行在调用
控制台.log
之前被解释,因此
未定义


参见

提升的是变量声明,而不是赋值

在第一个函数中,您仅在调用
console.log
后覆盖
text
的值,但没有将其他
text
引入函数的本地范围

在第二种情况下,您将引入一个新的
文本
变量,该变量是本地变量(并按预期初始化为
未定义
),由于变量提升,实际的
变量文本
行在调用
控制台.log
之前被解释,因此
未定义


请参见

提升:您可以理解它,因为整个函数体都位于脚本的顶部,并且包含 具有未定义的值(如果在赋值之前使用)

现在案例1:

在调用函数并执行console.log时,text的值仍为“外部”

在控制台日志之后,它将值更改为“内部”

如果在调用logIt()后立即编写console.log,那么它将显示“inside”

案例2:在这种情况下,您在函数logIt中创建了一个新的var,然后它将作为 var text=未定义(在赋值之前使用)


这次调用函数后,请尝试打印console.log(文本)。它将打印“在本例中为外部,因为全局范围在本例中由于logIt函数而无效”

提升:您可以理解它,因为整个函数体与变量一起位于脚本顶部 具有未定义的值(如果在赋值之前使用)

现在案例1:

在调用函数并执行console.log时,text的值仍为“外部”

在控制台日志之后,它将值更改为“内部”

如果在调用logIt()后立即编写console.log,那么它将显示“inside”

案例2:在这种情况下,您在函数logIt中创建了一个新的var,然后它将作为 var text=未定义(在赋值之前使用)


这次调用函数后,请尝试打印console.log(文本)。它将打印“在这种情况下是外部的,因为全局作用域在这种情况下没有效果,因为logIt函数”

在函数外部声明的变量是全局的,可以在函数内部使用。在函数外部声明的变量是全局的,可以在函数内部使用。@Wild-hm,可能您假设
text='inside'也被提升。请注意,只有变量
var x=“inside”和函数声明
function f(){}
被挂起。@Wild-hm,也许您假设
text='inside'也被提升。请注意,只有变量
var x=“inside”和函数声明
函数f(){}
被挂起。
var text = 'outside';
function logIt(){
    var text;
    console.log(text);
    text ='inside';
}
logIt(); //prints undefined
var text = 'outside';
function logIt(){
    console.log(text);
    text ='inside';
}
logIt(); //prints outside. why?
var text = 'outside';
function logIt(){
    console.log(text);
    var text ='inside';
}
logIt(); //prints undefined