背景:
语法借鉴 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.原型
过于复杂,后续再议