深入学习函数
- 普通的函数
- 1.私有作用域
- 2.形参赋值
- 3.变量提升
- 4.代码从上到下执行
- 构造函数(类)
- 函数
function fn(){ console.log(1); }
fn.aa = 33;//这种属性称为静态属性。没有动态属性!!
console.log(fn.aa);
复制代码
- 若函数当成对象时,函数名就相当于对象名
- 当成函数时,有一个属性是
prototype
指向原型对象 - 当成对象时,有一个属性
__proto__
,指向所属类的原型 - 所有的函数都是Function类的实例
instanceOf
看一个对象是否在另一个对象的原型链上
console.log(Function instanceof Object); //true
console.log(Object instanceof Function);//true
console.log(Function.prototype.__proto__ == Object.prototype); //true
console.log(Function.__proto__.__proto__ == Object.prototype); //true
console.log(Function.__proto__ === Object.__proto__); //true
复制代码
function Foo() {
getName = function () {
console.log(1);
};
return this;
}
Foo.getName = function () {
console.log(2);
};
Foo.prototype.getName = function () {
console.log(3);
};
var getName = function () {
console.log(4);
};
function getName() {
console.log(5);
}
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
复制代码
call apply bind
call
,apply
,bind
执行的作用:用来改变点前面方法的this的关键字
call
call
方法的参数:第一个参数用来改变点前面方法里的this关键字,从第二个参数开始,会当成实参传给点前面的方法 (传参方式:散列式)
function fn(a,b) {
console.log(this+a+b);
}
fn(10.20);
fn.call(); //实例去调用原型上的方法
fn.call({},20,30)//将fn中的this改变成{} [object Object]2030
fn.call(10,20,30)//60
复制代码
apply
apply
方法的参数:第一个参数用来改变点前面方法里的this关键字,第二个参数需要是数组或者类数组,然后一起传给点前面的方法 (传参方式:打包式)
fn.apply({},[20,30]);//传参时是打包式的但是实参传给形参时,还需要把实参里所有的内容一个一个的给形参
复制代码
function fn() {
"use strict" //严格模式
console.log(this);
}
fn.call(10);//{10} 不用严格模式:Number{10}
fn.call({});//{} {}
fn.call(null);//null window
fn.call(undefined);//undefined window
fn.call();//undefined window
复制代码
bind
bind
第一个参数和call作用相同,传参烦是和call方法一样都是散列式fn.bind({},10,20)
将所有的参数传给点前面的方法后返回一个需要执行的小函数,想要执行时手动执行 (柯里化函数)