1. 程式人生 > >JS原型鏈(3)

JS原型鏈(3)

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);  //列印函式體:如果是宣告的函式,此時函式會把同名的引數覆蓋,此時值為: 函式