1. 数据类型
- 字符串、数字、布尔、数组、对象、Null、Undefined
2. IIFE
- 为什么要用:定义与执行的结合不需要分开;传统的方法会直接污染全局命名空间(浏览器里的 global 对象,如 window),而IIFE能够有效地减少污染;能够生成独立的作用域;
- 如何实现:所谓不去污染全局命名空间,是因为 IIFE 创建了一个新的函数作用域,你真正的业务代码被封装在其中,自然就不会触碰到全局对象了。
- 应用条件:内部逻辑以及变量不会被外部调用的情况下建议使用。
3. 原型链
- prototype :是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象。它是显示修改对象的原型的属性。
- construct :当前对象的构造器的引用,不稳定易变
- _ proto _ :是一个对象拥有的内置属性(请注意:prototype是函数的内置属性,proto是对象的内置属性),是JS内部使用寻找原型链的属性。
- 父类属性发生改变,所有子类的对应属性都会改变;子类属性发生改变,而父类的属性不会受到影响;
### 4. 函数声明 & 函数表达式 - 函数表达式 var test = function() {}; //声明并定义
- 函数申明 function test() {}; //仅声明
- 函数声明的实际规则如下:函数声明只能出现在程序或函数体内。从句法上讲,它们 不能出现在Block(块)({ … })中,例如不能出现在 if、while 或 for 语句中。因为 Block(块) 中只能包含Statement语句, 而不能包含函数声明这样的源元素。另一方面,仔细看一看规则也会发现,唯一可能让表达式出现在Block(块)中情形,就是让它作为表达式语句的一部分。但是,规范明确规定了表达式语句不能以关键字function开头。而这实际上就是说,函数表达式同样也不能出现在Statement语句或Block(块)中(因为Block(块)就是由Statement语句构成的)。
5. Scoping & Hoisting
- 解析器会将任何声明定义操作分解为声明、定义两个步骤(如:var a=1; 转变为var a; a=1);
- 当在if、while、for内部进行变量声明(并不一定需要定义)的时候,代码解析器会将声明抽出if、while、for,并提升至当前函数级作用域的顶部,由于未被定义则其值为undefined;若在if、while、for内部同时存在定义操作,则定义将会保留在原来的位置。
示例:
var a = 1;
function foo() {
if (!a) {
var a = 2;
}
console.log(a); //2
};
foo();
将会被解析器解析为:
var a;
a = 1;
function foo() {
var a; //undefined
if (!a) { //!a==true
a = 2;
}
console.log(a); //2
};
foo();
其他关于if、while、for的测试代码:
var a = 1;
foo();
function foo() {
if (true) {
console.log(a);
var a=2;
}
// for(var i=0;!i;i++){
// console.log(a);
// var a=2;
// }
// var i=1;
// while(i){
// console.log(a);
// var a=2;
// i = !i;
// }
};
6. new 的过程
var Person = function(){};
var p = new Person();
new的过程拆分成以下三步:
- var p={}; 也就是说,初始化一个对象p
- p._ proto _ = Person.prototype;
- Person.call(p); 也就是说构造p,也可以称之为初始化p
7. 移动端angular框架引导策略
- 首页用zepto(25kb)或jquery(85kb)开发,其余页面用angular(157kb)开发;
- 网站首页加载zepto或jquery,在首页页面加载完成后通过事件请求预加载angular方便后边页面使用;
8. delete
delete运算符可以用来删除对象的属性。它将会移除对象中确定包含的属性。它不会触及原型链中的任何对象。所以,删除对象的属性可能会让来自原型链的属性浮现出来:
another_stooge.nikename; // "Moe"
// 删除 another_stooge.nikename 的 nikename 属性,从而暴露出原型链的 nikename 属性
delete another_stooge.nikename;
another_stooge.nikename; // 'Curly'
9. 减少全局变量
好处:1.避免大规模开发产生的命名冲突;2.提供开发的灵活度;
实践方法:
// IIFE产生局部作用域
(function( obj1, obj2){
}( obj1, obj2);
// 创建唯一的全局变量来归纳其他变量
var MYAPP ={}; // 唯一全局变量
MYAPP,stooge = {
}
10. call、apply、bind
- call、apply共同点:
- 定义:为当前对象调用另一个对象的其中一个方法。
- 作用:调用其他对象的部分方法、继承、多重继承
- call、apply区别:
- 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
- 语法:apply([thisObj[,argArray]])
bind:
IE6,7,8不支持
1. 语法:bind( thisobj)( [,arg1[, arg2[, [,.argN]]]]] )
var obj = {
x: 81,
};
var foo = {
getX: function(name,say) {
return name +" " +say;
}
}
console.log(foo.getX.bind(obj)("bind","hello"));
console.log(foo.getX.call(obj,"call","hello"));
console.log(foo.getX.apply(obj,["apply","hello"]));
11. 同源策略
同域名、同端口、同协议下的文档可以相互引用以及通信。
1. 如何解决跨域问题?
jsonp、 iframe、window.name、window.postMessage、服务器上设置代理页面
2. 数组添加
var array1 = [12 , "foo" , {name: "Joe"} , -2458];
var array2 = ["Doe" , 555 , 100];
Array.prototype.push.apply(array1, array2);
console.log(array1); // [12, "foo", Object, -2458, "Doe", 555, 100]
12. 获取计算后的样式值
自适应、未定义以及百分比样式不能直接获取其实际样式值得情况下可以通过该方法获取实际样式值
// 参数node:将要获取其计算样式的元素节点
function getCurrentStyle(node) {
var style = null;
if(window.getComputedStyle) {
style = window.getComputedStyle(node, null); //非IE
}else{
style = node.currentStyle; //IE
}
return style;
}
13.addEventListener 回调函数
- public override function addEventListener(type:String,
listener:Function, useCapture:Boolean = false, priority:int = 0,
useWeakReference:Boolean = false):void; - 若listener为Function() 绑定失败;
- 回调函数Function(event)默认传递该事件,可通过event.stopProgation()停止事件传播;
- 若Function需要获取传递参数,格式如 element.addEventListener(type, function(e,
data){ fn(e, data); }); 若Function中的this指向触发该事件的对象;
14. this的指向
- this指向当前对象或函数的引用者