概述
- JavaScript(ECMAScript)运行在浏览器之上
- 核心javascript语音需要结合浏览器对象模型(BOM)和文档对象模型(DOM)来理解
- 浏览器对象模型包含window对象及其子对象:navigator,history,screen,location,document.document对象是文档对象模型的根节点,是页面内容结构的一个树状表示。
JavaScript的历史
- 语法大多来自java,同时继承了awk和perl的一些语法,其基于原型的对象模型间接受到self的影响
- perl的箴言,不止用一种方法去做一件事影响了JavaScript,如创建和初始化数组的不同方式
- JavaScript与scheme语言相像的主要特征是它是一门函数式编程语言,既支持函数式编程又支持函数作为以及对象
作用域
全局,eval和函数 注意JavaScript的变量提升
一级函数
可以赋值给一个变量,作为参数传递给另一个函数,作为函数的返回值,或者包含在其他的数据结构中;函数是JavaScript中的基本单元,是名副其实的一级对象。
var happy = function(){
return ':)';
}
var said = function(){
return ':(';
}
var mood = function(aFunction){
return aFunction
}
list=[happy,said]
response = {fine:happy,underTheWeather:sad}
var iAmFeeling = mood(happy)
console.log(iAmFeeling)
var iAmFeeling = mood(sad)
console.log(iAmFeeling)
console.log(response.fine())
//匿名函数
console.log(list[0]())
console.log(function(){ return ";)"; }())
函数声明和表达式
- function操作符
- 可省略的函数名
- 一对小括号
- 一对大括号
最小化函数声明 function(){}
类C风格声明 function myFunctionName(){}
匿名函数 var x = function(){}
具名函数 var x = function y(){}
函数可以关联一个对象,这时称之为方法。对象被隐式的传递给其所调用的方法,方法可以访问和操作对象里的数据,通过this关键字引用对象
var obj = {}
obj.myVar = 'data associated with an object'
obj.myFunc = function(){ return 'I can access '+this.myVar;} //this:引用该对象
console.log(obj.myFunc())
可以在函数中定义其他函数,内部的函数可以访问外部函数的变量,一个函数返回一个内部函数时,就形成了闭包
function outer(){
var val = "I am in outer space";
function inner(){
return val;
}
return inner;
}
var alien = outer();
//返回的对象既包含函数本身,也包含创建函数时的环境。
console.log(alien())
立即执行函数将代码限定在函数的局部作用域内,避免了污染作用域
(function(){console.log('in an immediate function')}())
函调调用
- 函数
- 方法
- 构造函数
- 使用call()或apply()
不同的方式会影响this关键字引用的对象。第一种方式(函数),在非严格模式下,this指全局上下文;在严格模式下,返回undefined或者在执行上下文中得到的值。接下来的两种方式(方法和构造函数)是面向对象编程所特有的,其中方法调用是调用和对象关联的函数,而调用构造函数会创建一个新对象。和以上三种方式不同,call()和apply()允许在调用一个函数时, 显示指定上下文
var that = this
this随上下文而变,所以将它赋给that,以访问this原来的变量。
函数参数
函数通过签名中声明的命名参数接收参数。有一个特殊的变量arguments,它保存了所有传入函数的参数,不管是有名的还是没名的。
function add(){
var sum = 0;
for(i=0;i<arguments.length;i++){
sum+=arguments[i];
}
return sum;
}
console.log(add(1,2,3));
console.log(add.apply(null,[2,3,4]));
console.log(add.call(null,3,4,5));
对象
在JavaScript中,对象只是一组属性的集合。JavaScript中的对象也有继承,可以在JavaScript中创建类。
在JavaScript代码被放到web服务器上,按需加载可以提升效率。可使用由RequireJS等类库支持的AMD API来提升性能。该API按模块定义JavaScript代码,让模块和其依赖能异步加载。
JavaScript中值是true还是false
//结果都是false
console.log(false?'true':'false');
console.log(0?'true':'false');
console.log(NaN?'true':'false');
console.log(''?'true':'false');
console.log(null?'true':'false');
console.log(undefined?'true':'false');
//结果都是true
console.log('0'?'true':'false');
console.log('false'?'true':'false');
console.log([]?'true':'false');
console.log({}?'true':'false');
类型 | 结果 | 例子 |
---|---|---|
Undefined | “undefined” | typeof undefined |
Null | “object” | type null |
Boolean | “boolean” | type true |
Number | “number” | type 123 |
String | “string” | type ‘hello’ |
Function object | “function” | type function() |