JavaScript中的预解释

发布于 2020-01-07  417 次阅读 本文共1811个字


预解释是一种毫无节操的机制(真可谓是:自从学了预解释,从此节操是路人)

in 'num' in window 判断num是否为window对象的一个属性,是的话返回true,不是返回false

var obj = {name: "高佳睿", age: 18 };
console.log("name" in obj); // true
console.log("eat" in obj); // false

1、预解释的时候不管条件是否成立,都要把带var的进行提前声明

window的预解释: var num; -> window.num;

if (!("num" in window)) { // "num" in window -> true
  var num = 12;
}
console.log(num); // undefined

2、预解释的时候只先预解释‘=’左边的,右边的是值,不参与预解释

匿名函数之函数表达式:把函数定义的部分当作一个值赋值给我们的变量/元素的某一个事件

// window下的预解释: var fn;
fn(); // undefined() Uncaught TypeError: fn is not a function
var fn = function() {
  console.log("ok");
};
fn(); // ok
function fn() {
  console.log("ok");
};
fn(); // ok

3、函数执行定义的那个function在全局作用域下不进行预解释,当代码执行到这个位置的时候定义和执行一起完成了

(function(num){})(100);
~function(num){}(100);
+function(num){}(100);
-function(num){}(100);
!function(num){}(100);

4、函数体中的return下边的代码虽然不执行了,但是需要进行预解释;return后边跟着的都是我们返回的值,所以不进行预解释;

function fn() {
  // 预解释: var num;
  return function() {};
  var num = 100;
};
fn();

5、在预解释的时候如果名字已经声明过了,不需要重新声明,但是需要重新赋值在JS中如果变量的名字和函数的名字重复了,也算冲突
预解释: var fn; window.fn; fn =gjr001; window.fn = gjr001

var fn = 13;
function fn() {
  console.log("ok");
}

window 预解释:
声明+定义 fn = gjr002
声明 var fn; (不需要重新声明)
声明(不重复进行)+定义 fn = gjr003
---> fn = gjr003

fn(); // 2
function fn() { console.log(1); };
fn(); // 2
var fn = 10; // -> fn = 10
fn(); // -> 10() Error: fn is not a funtion
function() fn() { console.log(2); };
fn();

关于JavaScript中私有作用域的预解释

1、如何区分私有变量还是全局变量

  • 在全局作用域下声明(预解释的时候)的变量是全局变量
  • 在“私有作用域中声明的变量”和“函数的形参”都是私有变量

在私有作用域中,我们代码执行的时候遇到一个变量,首先我们需要确定它是否为私有变量,如果是私有的变量,那么这个变量和外边的没有任何关系;如果不是私有的,则往当前作用域的上级作用域进行查找,如果上级作用域也没有则继续查找,一直找到window为止...(作用域链)

2、当函数执行的时候(直接目的:让函数体中的代码执行),首先会形成一个新的私有作用域,然后按照如下的步骤执行:

  • 如果有形参,则先给形参赋值
  • 进行私有作用域中的预解释
  • 私有作用域中的代码从上到下执行
  • ...

函数执行形成一个新的私有作用域保护了里边的私有变量不受外界的干扰(外边修改不了私有的,私有的也修改不了外边的)->“闭包”

console.log(total); // undefined
var total = 0;
function fn(num1, num2) {
  console.log(total);
  // total不是私有的,找全局下的total,也就是在这里出现的所有total其实应该是全局的0
  total = num1 + num2; // 全局的total = 300
  console.log(total); // 300
};
fn(100, 200); 
console.log(total); // 300

努力,只为遇见更好的自己!