变量
var或者let/const定义变量:
let myVariable;
变量名大小写敏感
var:在距离最近的函数内部或是在全局词法环境中定义
const:已经定义不可变
let:
通过var声明的变量实际上总是在距离最近的函数内或全局词法环境中注册的,不关注块级作用域
数据类型
变量 | 解释 | 案例 |
---|---|---|
String | 字符串需要用引号包裹 | let myVariable = ‘Bob’; |
Number | 数字类型 -(2的63次方-1) ~ (2的63次方-1) 在JavaScript中还有一些带符号的值:+Infinity,-Infinity和NaN;分别代表正无穷、负无穷和非数值。 | let a=10; |
Boolean | true/false | let b=true; |
Array | 数组 | let myVariable = [1,‘Bob’,‘Steve’,10]; Refer to each member of the array like this: myVariable[0], myVariable[1], etc. |
Object | 对象,所有皆对象 | |
null | 空值 | 表示没有被呈现 |
Undefined | 未定义,变量初始化赋予undefined |
函数
重要:js不支持重载
函数声明
函数是js中最重要的一个概念。JavaScript中最关键的概念是:函数是第一类对象(first-class objects),或者说它们被称作一等公民(first-class citizens)
经常用到的函数类型
回调函数
callback不用过多解释,在异步操作中使用的非常广泛。它的核心是延迟支持,即某些操作后再执行。
function useless(dosomething){
// action
return dosomething();
}
存储函数
var store={
nextId:1,
cache:{},
add: function(fn){
if(!fn.id){
fn.id=this.nextId++;
this.cache[fn.id]=fn;
return true;
}
}
}
function ninja(){}
assert (store.add(ninja), "Function was already added")
assert (!store.add(ninja), "Only added once")
立即函数
(function(){})(3)
使用一元操作符也可以实现:
用于向JavaScript引擎指明它处理的是表达式,而不是语句。
箭头函数(ES6)
即lambda表达式
var values=[0,3,5,7,22];
values.sort((value1,value2) => value1-value2);
参数
形参,实参(略)
剩余参数
function multiMax(first,second, ...remaining){}
默认参数
function performAction( first, action="hello"){}
函数调用
函数中有2个隐式的参数:this,arguments
this表示被调用函数的上下文对象,arguments表示参数对象。
函数的调用方式:
● 作为一个函数(function)——skulk(),直接被调用。
● 作为一个方法(method)——ninja.skulk(),关联在一个对象上,实现面向对象编程。
● 作为一个构造函数(constructor)——new Ninja(),实例化一个新的对象。
● 通过函数的apply或者call方法——skulk.apply(ninja)或者skulk.call(ninja)。
闭包
闭包允许函数访问并操作函数外部的变量。只要变量或函数存在于声明函数时的作用域内,闭包即可使函数能够访问这些变量或函数。
闭包通常和柯里化联系在一起
var outValue="sam";
var later;
function outFunc(){
var innerValue="nnn";
function innerFunc(){
console.log(" see outValue")
console.log(outValue=="sam")
console.log(" see innerValue")
console.log(innerValue=="nnn")
}
later=innerFunc;
}
outFunc()
later()
在这里,闭包的变量声明时的作用域消失了,但是通过闭包,仍然能访问到原始的作用域。也就是说闭包访问变量的函数都有一个作用域链,包含闭包的全部信息。这些信息存储在内存里,直到引擎确保这些信息不再使用或页面卸载。
封装私有变量
JavaScript基于单线程的执行模型:在某个特定的时刻只能执行特定的代码。一旦发生函数调用,当前的执行上下文必须停止执行,并创建新的函数执行上下文来执行函数。当函数执行完成后,将函数执行上下文销毁,并重新回到发生调用时的执行上下文中。所以需要跟踪执行上下文——正在执行的上下文以及正在等待的上下文。最简单的跟踪方法是使用执行上下文栈(或称为调用栈)