背景:
語法借鑒 java
函數借鑒 scheme
原型繼承借鑒 self
正則表達式借鑒 Perl
1.動態語言
函數的定義和調用 形參與實參不需要一致
形參可由 arguments 類數組獲取 (形參傳入時與其形成映射關系)
變量之間無阻礙相互轉換,不需要指定類型,(前一刻可能是 num ,可以立馬變 str fn obj 。。)
2.解釋性語言、跨平台
js代碼運行前夕不需要編譯,但是有個預編譯過程(上下文環境、變量提升、形參實參統一化、函數聲明提升)
例子:
function a(){ if(true){ function aa(){console.log('true')} }else{ function aa(){console.log('false')} } aa();}
部分瀏覽器執行 a() - false
函數與變量都存在提升
不需要先生成文件再轉機器碼運行,直接解釋成0101跑起來
3.單線程
代碼塊之間不相互影響( 如兩個 script 之間)
之上而下運行,看一行執行一行,出現錯誤立馬報錯
4.this指向
根據 fn 調用場景,分為函數和方法(包括構造函數調用、call和apply的調用),this分別指向window(undefined)、obj(上下文)
例子:
var obj={a:function(){ console.log(this) } }
obj.a() - obj
var obj={a:function(){ return function(){console.log(this)} } }
obj.a()() - window
var obj={a:function(){ var that=this; return function(){console.log(that)} } }
obj.a()() - obj
5. 所有函數的方法 call apply bind
都改變 this 指向 (上下文環境)
call apply 借用函數
bind 返回函數體
可以實現效果:任何函數可以調用任何對象的方法
6.原型
過於復雜,后續再議