console.log(num);//报错,num is not defined,此错误在执行时出现,而非预解析时出现如何声明?(1)声明变量var num;注意:① 重复声明无效② 如果变量赋值,没有使用 var,那么会称为全局变量(注意:严格模式中报错)"use strict"; //严格模式③ 连续声明多个变量时一定要注意符号var num1, num2, num3, num4;//不要少了符号var num1 = 1,num1 = 1,num1 = 1,num1 = 1;(2)函数声明function 函数名() { // 函数声明}同时需要注意:函数声明必须独立于语句,成为一个单独的代码结构,只允许出现在全局范围内和函数中的全局范围内if(1){ function f() { //不是声明 }}function foo(){ function f() { //在函数内声明 }}3. 什么是记录声明
(1)代码片段1foo();function foo() { console.log('ok');}代码在执行之前会先预解析,检查到有函数声明,因此在执行代码之前,js 引擎就知道有函数 foo 了,因此在执行代码时调用 foo 就不会报错。(2)代码片段2foo();//foo is not defined+function foo() { console.log('ok');}函数不是一个独立的存在,是一个和 + 连接的表达式,因此在预解析的时候没有检查到声明,因此浏览器不会记录函数,在第一次调用的时候就会出现错误。(3)代码片段3foo();//foo is not a functionvar foo = function () { console.log('ok');};在代码执行之前,预解析检查到有 foo 声明(变量),因此记录变量 foo在代码执行的第一句调用函数(此时还未赋值),报错,foo不是一个函数(4)在预解析的时候,记录声明由两部分构成① 如果是变量声明,那么就记录下变量名,并且将其值确定为 undefined② 如果是函数声明,要记录函数名和函数体首先在内存记录下有一个名字,和变量名的声明此时的规则是一样的;紧接着记录下函数体,将函数名和函数体联系在一起练习:console.log(a);//打印函数体a();//'a'var a = 10;a();//报错,a is not functionfunction a(){ console.log('a');}a();//报错,a is not functionconsole.log(a);//10代码分析:① 预解析,检查到有声明,变量与函数首先预解析到有变量a存在,因此记录下a这个名字,和其值undefined;接着预解析到有函数a声明,记录下函数名a,但是发现已经记录了一个a,因此该操作无效,将函数体与a这个名字相关联,解析完毕。② 开始逐步执行代码赋值语句,执行给a重新赋值为10,将存储的关联函数覆盖;执行console.log打印,打印出a的值,由于a中存储的是数字10,因此打印10③ 分析完代码后,将上述代码转换成下列形式(注意:不是所有代码都可以这样转换)
新闻热点
疑难解答