首頁  >  文章  >  web前端  >  解析JavaScript中的不可見資料型別_javascript技巧

解析JavaScript中的不可見資料型別_javascript技巧

WBOY
WBOY原創
2016-05-16 17:11:18976瀏覽

JS提供了一些內建物件、函數和建構器供我們編程,如Math、parseInt、Object、Array等。這些都是可見的,程式設計時可以使用的。例如我可以new Object 或 new Array。

有些則是看不見的,這些物件只能由引擎在特殊的情況提供。這些類型的物件往往也被消減了一些功能。下面列舉一些

一、Arguments 類型
Arguments 類型 不能由程式設計師手動建立其對象,即你不能 new Arguments() 。 它有且僅有一個物件arguments

複製程式碼 程式碼如下:

function func( {
    console.log(arguments[0])     // 1
    console.log(arguments.length) // 3
}
func(1> >
arguments物件是在函數呼叫的時候創建的,只在函數內部可見和使用。可以看到arguments很像Array,可以依索引取元素,也有length屬性。但它不是Array,它沒有Array的有一些方法像是push、pop等。 Arguments 在ES5 10.6 定義。

二、bind回傳的函數很特殊

bind是ES5給Function.prototype新增的一個方法,它和call/apply一樣在function上直接呼叫。它傳回一個指定了上下文和參數的函數。

複製程式碼 程式碼如下:
function func(age) {


function func(age) {
con . ('name: ' this.name ', career: ' age)
}
var person = {name: 'John McCarthy'}
var f1 = func.bind(person, 'computer scientist')
f1() // name: John McCarthy, career: computer scientist


可以看到傳回的函數f1和普通函數一樣使用小括號執行呼叫了。 一切正常,但下面的程式碼會讓你大吃一驚 程式碼如下:



程式碼如下:


function func(age) {
    console.log('name: ' this.name ', career: ' age)
}
var person = {name: 'John McCarthy'} var f11 = func.bind(person, 'computer scientist')

console.log(f1.prototype) // undefined

跟上面程式碼比較,就最後一句話不同,沒有執行f1() ,而是印出f1.prototype,發現是undefined。

奇怪嗎? 每個function不都有一個prototype屬性嗎,這是用來實作原型繼承的哦。的確,bind回傳的function比較特殊,它沒有prototype。這個特殊的函數是由JS引擎創建的,客戶端程式設計師無法透過函數宣告或函數直接量得到。

這一點在規範裡有明確提示 ES5 15.3.4.5
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn