JS簡明基礎

數據類型

在最新的 ECMAScript 規範中,定義了7種數據類型閉包

  • null
  • undefined
  • boolean
  • number
  • string
  • symbol(不瞭解)
  • object

其中前6種爲基礎數據類型,只有 object 爲引用類型app

基礎數據類型和引用類型劃分的依據是其在內存中存儲的形式ide

基礎數據類型在內存對應的位置存儲的是null,undefined,字符串,數值或布爾值(symbol)函數

引用類型在內存對應的位置存儲的是地址this

經過操做符 typeof 判斷數據類型,不過有如下例外spa

typeof null // 'object'
typeof function(){} // 'function'

經過操做符 instanceof 判斷對象的類型prototype

The instanceof operator tests whether the prototype property of a constructor appears anywhere in the prototype chain of an object.

只要該對象的原型鏈上有以該構造函數生成的對象,就返回truecode

[] instanceof Object // true
[] instanceof Array // true
[] instanceof Date // false

函數與對象

typeof function(){} // 'function'

函數也是對象對象

對象大都是經過函數new出來,不考慮函數對象ip

var obj = { a: 10, b: 20 }; // 將當作是一種語法糖
// 至關於
var obj = new Object();
obj.a = 10;
obj.b = 20;

var arr = [5, 'x', true];
// 至關於
var arr = new Array();
arr[0] = 5;
arr[1] = 'x';
arr[2] = true;

函數Fn也是對象,具備屬性prototype,其指向一個對象P,經過new Fn()產生的對象fn,fn.__proto === Fn.prototype,Fn.prototype === P

Returns a reference to the Object constructor function that created the instance object.

對象經過 constructor 找到生母是誰

function Fn() { }
let fn = new Fn()
Fn.constructor === Function // true
fn.constructor === Fn // true

Untitled Diagram (http://ipic-nbb3210.oss-cn-beijing.aliyuncs.com/td1ci.jpg).png)

經過 hasOwnPrototype ,判斷某屬性是對象自身擁有的,仍是其原型鏈上的

函數

內部變量聲明&提高

  • 函數在執行以前會搜索函數體內全部的函數聲明,將其移至函數體的開始
  • 函數在執行以前會搜索函數體內全部經過 var 聲明的變量,將其移至函數體的開始

    • 移至函數聲明的後面
    • 只聲明變量,並不給變量賦值或賦值爲undefined,賦值的操做,仍在原地
console.log(Person) // function Person(){}
function Person(){
}
var Person = 2
console.log(Person) // 2
console.log(Person) // function Person(){}
var Person = 2
function Person(){
}
Person // 2
// 至關於
console.log(Person)
function Person(){
}
var Person
Person = 2

參數

var v1 = {}
function func(obj){
  obj = {
    name: 'v1'
  }
}
func(v1)
// 至關於
func(v1)
function func(obj){
  let obj = v1
  obj = {
    name: 'v1'
  }
}

函數中傳遞參數,至關於額外執行了let parameter = argument,在函數體內聲明變量名爲形參的局部變量,而且值爲實參

this

函數內部this指向的對象取決於函數被調用的情形。

  • 經過 new 操做符調用函數且函數沒有明確的返回值時,this指向函數將要建立的對象
  • 函數被看成對象的屬性調用,this指向調用該函數的對象
  • 經過call,apply,bind顯示地給函數綁定調用對象
  • 找不到對象的話就是宿主環境(window)

做用域

函數能夠經過參數得到額外的變量,

函數也能夠經過this對象來得到額外的變量,

函數還能夠經過做用域得到額外的變量

相比於this對象,動態地得到額外的變量;經過做用域得到的額外的變量是在函數書寫的時候就肯定了,靜態做用域

let x = 10;
function foo() {
  console.log(x);
}
function bar(funArg) {
  let x = 20;
  funArg(); // 10
}
bar(foo);

函數在執行時,其上下文是基於它書寫的地方

閉包

1  function foo() {
2     var a = 2;
3
4     function bar() {
5         console.log( a );
6     }
7
8     return bar;
9  }
10
11  var baz = foo();
12
13  baz(); // 2
  1. a 是 foo() 內部的變量,不能在函數外部被直接訪問
  2. bar 能夠訪問 foo() 內部全部的變量,包括 a
  3. bar 被做爲返回值,返回給了外部變量 baz,所以經過 baz 能夠訪問 foo() 內部的變量,包括 a

bar 內部包裹着一段代碼 console.log(a) ,雖然它在第13行,經過 baz 來調用,但實際上它執行時的上下文還是第5行的上下文

Closure is when a function is able to remember and access its lexical scope even when that function is executing outside its lexical scope.

閉包的本質是做用域

原本,當 foo() 執行完後,這個做用域及其內部的變量就被回收了,可是

bar() still has a reference to that scope, and that reference is called closure.
相關文章
相關標籤/搜索