Javascript

2016-09-28  本文已影响21人  李标

六大类型

Undefined
Null
Bollean
String
Number
Object

对象类型

原生对象:

隐式类型转换:

类型识别:

function getConstructorName(obj){
  return ( obj === undefined || obj === null )? obj+'' : obj.constructor.toString().match(/function\s*([^(]*)/)[1];
}

函数

//函数声明
function foo(){}

//函数表达式
var foo = function(){};

//函数实例化
var foo = new Function('i','console.log(1);');


//变量、函数声明前置:

//function
console.log(foo);
//undefined
console.log(bar);

function foo(){}

var bar = function(){};

js作用域:对象、函数有独立作用域

函数调用方式

Function.prototype.apply(this, [])
Function.prototype.call(this, ...args)

//保存函数的参数,以便直接调用
var fooCopy = foo.bind(this, ..args);
fooCopy();

arguments

arguments是一个Array-like对象

闭包

原型vs类

设置对象的原型

  1. Object.create(proto);
var Car = {
  start: function(){
    console.log('start');
  }
}
var landRover = Object.create(Car);
//'start'
landRover.start();
  1. 使用构造函数构造对象,使用prototype设置原型
var Car = function(){

}
Car.prototype.start = function(){
  console.log('start');
}

var landRover = new Car();
//'start'
landRover.start();

原型链继承

//Car构造函数
var Car = function(){

}
Car.prototype.start = function(){
  console.log('start');
}

//LandRover构造函数
var LandRover = function(){

}
LandRover.prototype = new Car();

var landRover = new LandRover();
//start
landRover.start();

obj.hasOwnProperty(name);

构造函数的原型链

Car --> Function --> Object

LandRover --> Function --> Object

JS变量作用域

var x = 10;
function foo(){
  console.log(x);
}
function bar(){
  var x = 20;
  foo();
}
//10
bar();
var obj = {foo:'bar'};
with(obj){
  //'bar'
  console.log(foo);
}

声明函数与函数表达式

带名称的函数表达式

(function foo(){
  //foo并没有被修改
  foo = 1;
  //function
  console.log(foo);
})();
//error
console.log(foo);

使用函数表达式创建闭包

function foo(){
  var i = 0;
  return function(){
    console.log(i++);
  }
}
var bar = foo();
//0
bar();
//1
bar();

闭包的应用

//错误实例
function addHandlers(nodes){
  for(var i=0; i<nodes.length;i++){
    nodes[i].onclick = function(){
      //当函数执行的时候,i已经变成了nodes.length,所以所有的node都会打印nodes.length
      console.log(i);
    }
  }
}

//使用闭包
function addHandlers(nodes){
  //每调用一次helper,都会创建一个闭包,保存i的值
  function helper(i){
    return function(){
      //0 1 2 3
      console.log(i);
    };
  }
  for(var i=0;i<nodes.length;i++){
    nodes[i].onclick = helper(i);
  }
}

上一篇 下一篇

猜你喜欢

热点阅读