JS之预解释原理 (2)

例子中的if是不成立的,预解释的时候,碰到非functon内的var,都会声明,无论你写在if else 还是别的判断里; 假设if语句起作用的话,那么第一次log(a)的时候,就会报错了(没有声明的变量,是不能直接用的,除非typeof ),而声明并且没有赋值的表现才是undefined;假设不成立; 最开始总结的预解释步骤:代码运行之前,先扫描有没有带var关键字的变量名,有的话,为这个变量名,在内存里开一个空间;预解释是发生在代码执行前的,所以if根本阻挡不了预解释;

2、预解释只发生在”=“的左边,只把左边的进行预解释,右边的是值是不进行预解释的

匿名函数之函数表达式:把函数定义的部分当做值赋值给一个变量或者元素的事件

fn1();//->undefined() Uncaught TypeError: fn is not a function JS中只有函数可以执行 && JS上面的代码如果报错了,在不进行任何的特殊处理情况下我们下面的代码都不在执行了 var fn1 = function () { console.log("ok"); }; fn1(); //预解释的时候:fn=xxxfff000 fn2();//->"ok" function fn2() { console.log("ok"); } fn2();//->"ok"

预解释的时候:var fn1 = function()... ->fn的默认值是undefined;这里即使有function,也是不能进行预解释的

3、函数体中return下面的代码都不在执行了,但是下面的代码需要参加预解释;而return后面的东西是需要处理的,但是由于它是当做一个值返回的,所以不进行预解释;

function fn() { console.log(total); return function sum() {};//return是把函数中的值返回到函数的外面,这里是把function对应的内存地址返回的到函数的外面,例如:return xxxfff111;函数体中return下面的代码都不在执行了 var total = 10; console.log(total); }

4、匿名函数的function在全局作用域下是不进行预解释的;

匿名函数之自执行函数:定义和执行一起完成了;函数内的声明,只是在函数内使用;

(function(num){ var testStr="test"+num; console.log(num); })(100); console.log(testStr);// testStr is not defined

5、在预解释的时候,如果遇到名字重复了,只声明一次。 不重复的声明,但是赋值还是要重复的进行的

  预解释:

var fn; 声明 fn = xxxfff000; [声明]不用了+定义 fn = xxxfff111; [声明]不用了+定义 // ->fn=xxxfff111 var fn = 12;//window.fn=12 function fn() {//window.fn=function(){} }

  JS中作用域只有两种:

window全局作用域;

函数执行形成的私有作用域;

{name:“”} if(){} for(){} while(){} switch(){} 这些都不会产生作用域;

ES6可以用let形成块级作用域

面试题 // 涉及this的指向和闭包 var num = 20; var obj = { num: 37, fn: (function (num) { this.num *= 3; // global num * 3 num += 15; // global num + 15 var num = 45; return function () { this.num *= 4; // 37*4 num += 20; // 调用外部函数的num (45+20) console.log(num); }; })(num), //->把全局变量num的值20赋值给了自执行函数的形参,而不是obj下的30,如果想是obj下的30,我们需要写obj.num }; var fn = obj.fn; // 执行了第1次 fn(); //->65 , 执行了第2次=> window.num = 240 obj.fn(); //->85 闭包, obj.num = 37*4 = 148 console.log(window.num, obj.num); // 240,148

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpjyfw.html