提升
1 变量提升
console.log(a);
var a = 1;
2 函数表达式
- 函数表达式的提升 === 变量提升
a();
var a = function(){...};
3 函数声明
func();
function func(){ console.log(1); }
var func = function(){ console.log(2); }
func();
TEST
function func(){
a = 1;
console.log(window.a); // ?
console.log(a); // ?
var a = 2;
console.log(a); // ?
}
func();
this
TEST
var people = {
Name: "a",
getName : function(){
console.log(this.Name);
}
};
var bar = people.getName;
bar();
var people = {
Name: "a",
getName : function(){
console.log(this.Name);
}
};
people.getName();
1 默认绑定
var name = 'b';
var a = {
name: 'a',
getName: function() {
console.log(this.name);
}
}
var obj = a.getName;
obj(); // ?
2 隐性绑定
var name = 'b';
var a = {
name: 'a',
getName: function() {
console.log(this.name);
}
}
var obj = a.getName();
obj; // ?
3 强制绑定
call apply bind 区别
- call从第二个参数开始所有的参数都是 原函数的参数。
- apply只接受两个参数,且第二个参数必须是数组,这个数组代表原函数的参数列表。
- bind只有一个函数,且不会立刻执行,只是将一个值绑定到函数的this上,并将绑定好的函数返回。
var name = 'b';
var a = {
name: 'a',
getName: function() {
console.log(this.name);
}
}
a.getName.call(this);
var name = 'b';
var a = {
name: 'a',
getName: function() {
console.log(this.name);
}
}
var func = a.getName.bind(this);
func();
4 New绑定
创建一个新对象。
把这个新对象的__proto__属性指向原函数的prototype属性。(即继承原函数的原型)
将这个新对象绑定到 此函数的this上 。
返回新对象,如果这个函数没有返回其他对象。
var name = 'b';
function func() {
this.name = 'a';
console.log(this.name);
}
var obj = new func();
obj; // ?
5 箭头函数
在定义时绑定this
this无法修改
var name = 'b';
var people = {
name: "a",
getName : function() {
return () => {
console.log(this.name);
}
}
};
var bar = people.getName();
bar();
TEST
function foo(arg){
this.a = arg;
return this
};
var a = foo(1);
var b = foo(2);
console.log(a.a); // ?
console.log(b.a); // ?
var x = 1;
var obj = {
x: 2,
f: function(){ console.log(this.x); }
};
var bar = obj.f;
var obj2 = {
x: 3,
f: obj.f
}
obj.f();
bar();
obj2.f();
function obj() {
getName = function () { console.log (1); };
return this;
}
obj.getName = function () { console.log(2);};
obj.prototype.getName = function () { console.log(3);};
var getName = function () { console.log(4);};
function getName () { console.log(5);}
obj.getName (); // ?
getName (); // ?
obj().getName (); // ?
getName (); // ?
new obj.getName (); // ?
new obj().getName (); // ?
new new obj().getName (); // ?
执行环境&作用域
- 变量、函数表达式——变量声明,默认赋值为undefined;
- this——赋值;
- 函数声明——赋值;
这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。
作用域在函数定义时就已经确定了。而不是在函数调用时确定。
var a = 10;
function fn() {
console.log(a);
}
function bar(f) {
var a = 20;
f()
}
bar(fn);
1 全局执行环境
2 fn执行环境
3 bar执行环境
var a = 10; // 1
var b = 200;
function fn() {
var b = 20;
function bar() {
console.log(a + b);
}
bar(); // 3
}
fn(); // 2
var a = 10; // 1
var b = 200;
function fn() {
var b = 20;
function bar() {
console.log(this.a + this.b);
}
bar(); // 3
}
fn(); // 2
闭包
函数作为返回值,函数作为参数传递。
function fn () {
var max = 10;
return function bar(x) {
if (x > max) {
console.log(x);
}
}
}
var f1 = fn();
var max = 100;
f1(15);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。