学习Javascript的var预解析和函数声明升级

学习Javascript的var预解析和函数声明升级
1、可变的预编译

Javascript的语法类似于C,java,C #,并统称为C类的语法。谁在C或java编程经验应该熟悉声明和使用后学生的规矩。如果您使用未声明的变量或函数,您将在编译阶段报告错误。然而,在声明变量和函数之前,Javascript可以使用它们。现在让我们深入了解这个谜。

先看一段代码:
(函数(){())
console.log(nosuchvariable); / / referenceerror:nosuchvariable未定义
})();
运行上面的代码是错误的,但这正是我们所期望的,因为nosuchvariable变量没有定义的话!再看下面的代码:
(函数(){())
console.log(declaredlater); / /未定义
无功declaredlater = 现在的定义!;
console.log(declaredlater); / /现在的定义!
})();

首先,上面这段代码是正确的,没有问题,但是你为什么不犯错误呢是调用语句后的declaredlater定义变量为什么输出未定义

这实际上是Javascript解析器的幽灵。解析器将把当前范围中声明的所有变量和函数放在作用域的开头,但是只有变量的声明被推进到作用域的开始,赋值操作保留在原来的位置
(函数(){())
无功declaredlater; / /表是事先的范围开始!
console.log(declaredlater); / /未定义
declaredlater = 现在的定义!;赋值操作仍然在原地!
console.log(declaredlater); / /现在的定义!
});
这就是为什么上面的代码不报告例外。变量和函数declaredlater后早期后,事实上变量是放在函数调用前,根据Javascript语法的定义,宣布没有被赋值的变量将自动被定义的,所以,第一次印刷的declaredlater变量的值是不确定的,我们对declaredlater变量赋值操作,第二重新印刷将输出变量现在的定义!。

再看一个例子。
变量名=巴金斯;
(函数(){())
console.log(原来的名字叫+姓名); / / 原来的名字是不确定的
var昂德希尔;
console.log(新名称+姓名); / /新的名字是昂德希尔
})();
上面的代码中,我们首先声明一个变量的名字,我们的目的是希望能够在第一次打印的名字的变量定义的变量名的全球范围的输出,然后定义一个局部变量的名称覆盖函数的全局变量,局部变量的值,最后输出。第一输出的结果是从我们的期望完全不同。原因是我们定义的局部变量在它的范围内是预先的,也就是说,它变成了以下形式。
变量名=巴金斯;
(函数(){())
变量名!
console.log(原来的名字叫+姓名); / / 原来的名字是不确定的
name =昂德希尔;
console.log(新名称+姓名); / /新的名字是昂德希尔
});
由于Javascript有这样一个怪癖,所以建议您将变量声明放在操作范围的顶部,这样您就可以提醒自己时间了。

2。函数声明提前。

前面是变量,然后我们讨论函数。

函数分为两种情况,一种是函数声明,第二种是函数对变量的赋值,即函数表达式。

首先,第一种情况,在代码上:
(isithoisted); / /是的!
功能isithoisted(){
console.log(是!;
}
如上所述,Javascript解释器允许您在函数声明之前使用,也就是说,函数声明不仅是函数名的高级化,而且整个函数的定义也是高级的,因此可以正确地执行上面的代码。

再看第二个例子:函数表达式的形式:
DefinitionHoisted (hoisted); / / Definition!
definitionnothoisted(定义); / /列表不是一个函数
功能definitionhoisted(){
console.log(定义悬挂!;
}
无功definitionnothoisted =函数(){()
console.log(的定义没有悬挂!;
};
我们做了一个比较,definitionhoisted功能的正确执行,与第一种类型的变量是一致的;definitionnothoisted提前,但他的作业(或功能)并不是提前,从这一点来看,和我们说话前提前变量是完全相同的,因为。默认值是在变量的值未定义之前,因此错误属于该类型不匹配,因为未定义的不是一个函数,当然不能调用。

总结

上述解释可概括如下:

变量的声明被推进到作用域的顶部,赋值保持在适当的位置。

整个函数声明提前进行。

当一个函数被表达时,只有变量是高级的,函数不是高级的。

3,var的副作用

隐式全局变量和清晰定义的全局变量之间的一些小差异是通过删除操作符使变量不明确的能力。

var创建的全局变量(在任何函数以外的程序中创建)不能删除。

不包含var(忽略是否在函数中创建)的隐式全局变量可以被删除。

这表明,在技术中,隐式全局变量不是真正的全局变量,但它们是全局对象的属性
定义三个全局变量
无功global_var = 1;
global_novar = 2; / /例子
(函数(){())
global_fromfunc = 3; / /例子
}();

尝试删除 / /
删除global_var; / /假
删除global_novar; / /真的
删除global_fromfunc; / /真的

测试删除
类型global_var / /数;
类型global_novar; / / 的定义
类型global_fromfunc; / / 的定义

在ES5的严格模式,未声明的变量(如在前面的代码片段两反面教材)将抛出一个错误。

4、单var表单声明变量

在函数顶部使用单个var语句是一种有用的形式,其好处是:

提供一个位置来查找函数所需的所有本地变量。

用于防止变量在定义之前使用的逻辑错误。

更少的代码(类型AH传递值,单线完成)

单个var的形式如下所示。

函数(){
var a=1,
b=2,
总和= A + B,
MyObject = { },
我,
J;
函数…
}
你可以使用var语句声明多个变量,用逗号分开。初始化值时这个初始化变量同样是好的。这样可以防止逻辑错误(所有未初始化的变量是不确定的,初始值)和增加代码的可读性。当你看到代码,你可以根据初始化值知道这些变量的一般用途。

以上是javascript的var预解析和函数声明,改进学习内容,希望对您有所帮助。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部