美文网首页js笔记
js笔记之预解释的特殊处理及上级作用域

js笔记之预解释的特殊处理及上级作用域

作者: uplyw | 来源:发表于2018-04-29 14:09 被阅读10次
预解释是毫无节操的一种机制
自从学了预解释,从此节操是路人

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

var obj = {name:"lilei",age:18}
console.log("name" in obj) // true
console.log("sex" in obj) // false

1.

预解释的时候不管条件是否成立,都要把带var的进行提前的声明
window 的预解释: var num; -> window.num


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

2.

预解释的时候只预解释"="左边的,右边的是值,不参与预解释
匿名函数之函数表达式:把函数定义的部分当做一个值赋值给我们的变量/元素的某一个事件


fn() // ok
function fn(){
    console.log("ok")
}
fn() // ok


fn1() // Uncaught TypeError: fn1 is not a function
var fn1 = function(){
    console.log("ok")
}
fn1() // ok


3.

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

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

4.

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

function fn(){
    console.log(num) // undefined
    return function(){
        
    }
    var num = 12;
}
fn()

5.

预解释:var fn; window.fn
function fn(); window.fn
在js中如果变量名和函数名重复了,也是冲突(只能保留一个)
在预解释的时候,如果名字已经声明过了,不需要重新的声明,但是需要重新的赋值

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


fn() 
function fn(){
    console.log(1)
}
fn() 
var fn = 10 
fn() 
function fn(){
    console.log(2)
}
fn()
// 执行结果: 2 2 报错中断

// window 预解释:(var和function)
// 声明 + 定义 fn = xxxfff111
// 声明 var = fn
// 声明(不重复进行) + 定义 fn = xxxfff222
// -> fn = xxxfff222
fn() // -> 2
function fn(){
    console.log(1)
}
fn() // -> 2
var fn = 10 // fn = 10
fn() // -> 10()  error:fn is not a function(报错后面代码不执行)
function fn(){
    console.log(2)
}
fn()

如何查找当前作用域的上一级作用域?

看当前函数是在哪个作用域下定义的,那么它的上级作用域就是谁 -> 和函数在哪执行的没有任何关系

var num = 12;
function fn(){
    var num = 120;
    return function () {
        console.log(num);
    };
};
var f = fn()
f(); // 120
~function (){
    var num = 1200;
    f() // 120
}()

相关文章

网友评论

    本文标题:js笔记之预解释的特殊处理及上级作用域

    本文链接:https://www.haomeiwen.com/subject/hyiolftx.html