预编译 作用域 闭包

    xiaoxiao2025-07-19  6

    预编译

    函数的预编译发生在函数执行的前一刻;
    window.prompt ( ’ input ’ ) // 输入(字符串形式)
    parsetInt(window.prompt(’ input ’ )); //转化成数字型;
    未经声明的变量归window所有;
    a = 123; or a = b = 123; ( 暗示全局变量 ) ;
    一切声明的变量都是window的属性;
    意思就是 var a = 123 --> window.a = 123;
    若访问a(console.log(a)) -->其实就是访问 console.log(window.a);
    typeof(null) ----> object

    隐式类型

    作用域精解

    function a(){ function b(){ var b = 234} var a = 123; b(); } var glob = 100; a();
    先创建一个 GO;
    然后执行 a function 时 同时创建一个 a function 的 AO,顺便将a 的 AO放到最高;
    b 创建它自己的 AO 的时候先拿过来的是 a function 执行后的结果:
    AO (a function 创建的);[[scope]] 0
    GO (window的(全域的));[[scope]] 1
    b 创建的一个 AO 放在最高,形成下面这样的形式:
    AO (b function 创建的);[[scope]] 0
    AO (a function 创建的);[[scope]] 1
    GO (window的 (全域的));[[scope]] 2
    b 函数执行完后把自己的 AO 取消 ,b函数恢复到被定义的状态等待下一次执行;相当于切断 函数与 [[scope]] 0 之间的联系;
    exmple:
    function a() { function b() { function c() { } c(); } b(); } c();

    用式子表示为这样:

    a defined a.[[scope]] – > 0 : GO a doing a.[[scope]] – > 0 : aAO 1 : GO b defined b.[[scope]] – > 0 : aAO 1 : GO b doing b.[[scope]] – > 0 : bAO 1 : aAO 2 : GO c defined c.[[scope]] – > 0 : bAO 1 : aAO 2 : GO c doing c.[[scope]] – > 0 : cAO 1 : bAO 2 : aAO 3 : GO

    闭包

    eg

    内部的函数被保存到了外部,将会形成闭包;
    闭包会导致原有作用域链不释放,造成内存泄漏(内存占用的多,剩的少)。

    立即执行函数

    有两种写法: 1.(function (){}()); W3C 建议第一种 2.(function (){})(); 只有表达式才能被执行符号执行; (函数名字会被自动忽略) /* function() { console.log('a'); }() */ ..此函数不能被执行; /* var test=function () { console.log('a'); }() */ ..此函数可被执行。 /* +function test(){ console.log('a'); }() */ /* function test (a, b, c, d) { console.log(a + b + c + d); }(1, 2 ,3 ,4) */ ..此函数系统不会报错(会认为有逗号运算符存在它就是一个表达式)但是没意义;
    逗号运算符 ,
    var a = (2, 3); a = 3; 先看前面的表达式如果前面要计算的话先计算,然后看后面的表达式要计算就计算; 然后把后面表达式的值返回:
    JavaScript中为假的值有6个

    分别是:

    undefinedNaN0“”nullfalse 虽然这几个值都为假 但他们不一定都相等: for exmple: console.log( false == null ) // false console.log( false == undefined ) // false console.log( false == 0 ) // true console.log( false == '' ) // true console.log( false == NaN ) // false console.log( null == undefined ) // true console.log( null == 0 ) // false console.log( null == '' ) // false console.log( null == NaN ) // false console.log( undefined == 0) // false console.log( undefined == '') // false console.log( undefined == NaN) // false console.log( 0 == '' ) // true console.log( 0 == NaN ) // false
    对于 == 有以下结论:
    false除了和自身比较为 true 外, 和 0,""比较也为 truenull 之和 undefined 比较是为 true 反过来 undefined 也仅和 null 比较为 true ,没有第二个空字符串“”除了和 false 比较为 true 还有一个数字 0;
    最新回复(0)