JS原型鏈(3)
阿新 • • 發佈:2019-02-05
A 函式三種表示方法:
1.函式宣告
function foo() {}2.函式表示式
// 2 var foo = function() {};3. new Function()
語法:函式 = new Function(arg1, arg2, ...., argN, functionBody);
注意點:
1 所有的引數都是字串
2 除了最後一個引數之外,其他的引數都是生成的新函式的引數
function f(a, b, c) { alert(123); } var f = new Function("a", "b", "c", "alert(123)"); f(); //執行alert(123) console.log(f instanceof Function); // true console.log(f.__proto__ === Function.prototype);//true
3.可以看出 函式f 同時也是一個例項物件,此時,所有的函式都是Function的例項。
把函式當作是物件看待,此時,所有的函式都是Function的例項,以下全部都是 true
function Person() {} console.log(Person instanceof Function); console.log(Array instanceof Function); console.log(Date instanceof Function); console.log(RegExp instanceof Function); console.log(String instanceof Function); console.log(Number instanceof Function); console.log(Boolean instanceof Function); console.log(Object instanceof Function);
結論:
1. 所有的函式都是Function的例項,函式也是物件
2. 所有的函式(當作物件看)都繼承自 Function.prototype
3. Function是建構函式,建構函式也是函式
4. Function 也繼承自 Function.prototype,也是被Function創建出來的
B.eval使用
作用:能將字串當作程式碼來執行
1.eval('alert(111)') =======等同於頁面中寫alert(111) 2 . var str = '{ "name": "jim", "age": 19, "gender": "男" }' var c = eval('('+str+')')
那麼,c就轉化為一個物件了。有時候在前端寫業務邏輯時候發現非常有用
C.靜態成員
js的靜態成員借鑑了java的靜態成員,不需要例項化物件,直接可以用函式呼叫
如:
function Person() {}
Person.sayHi = function(str) {
alert(str);
};
Person.sayHi(111) //執行alert(111)
D.js 作用域1 js 是詞法作用域,意思是說,變數的作用範圍, 在書寫程式碼的時候就已經決定, 與執行時無關。
例如:
var num = 123;
function f1() {
console.log(num);
}
function f2() {
var num = 456;
f1();
}
f2(); //列印結果是123 ,因為f1函式的num在程式碼寫完都已經確定了,這就叫做詞法作用域
2 如果函式與變數重名
console.log(f); // function f() {}
function f() {}
var f = 1;
function f() {}
var f = 1;
console.log(f); // 1
如果函式和變數重名,如果是在賦值之前 列印,此時 結果為 函式
如果是在賦值之後 列印,此時 結果為 變數的值
3 函式引數跟函式體內部的變數重名的情況:
function foo(a) {
var a;
console.log(a);
a = 10;
}
foo(100); //列印結果為100 在列印之後賦值,就為形參的值
function foo(a) {
var a=10;
console.log(a);
}
foo(100); //列印結果為10 在列印之前賦值,就為內部變數的值
function foo(a) {
console.log(a);
function a() {}
}
foo(100); //列印函式體:如果是宣告的函式,此時函式會把同名的引數覆蓋,此時值為: 函式