第 1 章 JS變量、做用域

@(es5)java

  • 基本類型
  • 引用類型

1、 判斷變量類型

  1. typeof (可以判斷的值:undefinedstringnumberfunction;其餘的類型,如對象、數組、nullundefined 均判斷爲object)
  2. instanceof (不推薦)
  3. getPrototypeName ()
Object.getPrototypeName.call(null,variable) === '[object array]'
Object.getPrototypeName.call(null,variable) === '[object object]'
isNaN(NaN)
Array.isArray(ary)

2、做用域 和 上下文

  • 變量生命週期
    在函數內聲明的 變量,在函數執行完了就會結束。
  • 訪問變量
    先在函數內部查找有無變量,若沒有,則在函數外部的包裹自身的函數查找,這樣依次查找,直至找到全局做用域下。

ps: var只對第一個變量前的的等號起做用,後面有變量則是全局做用下,(不推薦這種寫法)。數組

function foo() {
    var x = y = 0;
}
y;// 0

1. 做用鏈

ps:閉包能夠改變函數的做用鏈(延長做用鏈)閉包

function foo() {
    var x = 0;
    return function () {
        return ++x;
    }
}
var b = foo();
b();//1
b();//2

2. 上下文(this

在es5中,this的指向是調用時使用的對象函數

function fn () {
    console.log(this)
}
fn() // window

const person = {
    say: function () {
        console.log(this)
    }
}

person.say() // person

setTimeout(function () {
    console.log(this === window) // true
})

ps: setTimeoutsetInterval 第一個參數function的this指向是window性能

2、JS的解析機制

1. 預解析

  1. 執行代碼在前,function預解析高於var
console.log(a); //function () { ... }
var a = 0;
function a() {
    //TODO
}
  1. function fn(){}這種形式是預解析,不是變量賦值。即,若是var 聲明的變量和function fn(){}的函數同名,在執行過程當中執行var中的變量,而function對應函數不存在。
console.log(a); //function () { ... }
var a = 2;
function a() {
  console.log('fn a()');
}
console.log(a); // 2
// var a = 3;
a(); // error: a is not a function

this

console.log(a); //function () { ... }
var a = 2;
console.log(a); // 2
// var a = 3;
a(); // error: a is not a function
function a() {
  console.log('fn a()');
}

3、垃圾收集

歷史問題:標記清楚、引用計數、性能問題、管理內存es5

  1. 只要重複引用,用變量代替
  2. 內存少用,可以消除的必定銷燬

內存管理銷燬

var global_variable = null;
相關文章
相關標籤/搜索