函数:
Javascript的函数可以嵌套在其他函数中定义,这样就形成了闭包。
var a = 123;
function b( ){
var a = 456; // 局部变量
function c(){ // 这里形成了闭包 在作用域中返回局部变量
return a;
}
return c(); // 返回调用
}
b(); // 456
函数定义:
函数名称标识符:用途就像变量名字,只存函数体中,指代函数对象本身。
一对圆括号:包含由0个或多个用逗号隔开的标识符组成的列表,这些标识符就是参数,就像函数体的局部变量。
一对花括号:包含0条或多条javascript语句。这些语句构成了函数体,一旦调用函数,就会执行这些语句。
使用:
function preson(x,y){
console.log(x+y);
}
preson(1,2); // 调用且执行 print ==>3
函数的实参和形参:
使用:
function preson(x,y){ // 形参 x y
console.log(x+y);
}
preson(1,2); // 调用时传入实参 1 2
将函数用做值:
function add(x,y) { return x + y };
function subtract(x,y) { return x - y };
function operate(operator,operand1,operand2){
return operator(operand1,operand2); // 将上面的某个函数作为参数 传入两个操作数调用,最后调用它
}
// 第一个实参为 add() 二调用了add函数 三调用了subtract();
// add()⇒ 返回的是相加 所以 (1+2)+(1-2)
operate(add,operate(add, 1,2 ),operate( subtract,1 ,2));
匿名函数:
结束函数定义立即调用它
(function(){
模块代码…
}());
arguments并不是真正的数组,它是一个实参对象。每个实参对象都包括以数字为索引的一组元素以及length属性。(严格模式无法使用)
call()和apply()方法:
我们可以将call、apply看做是某个对象的方法,通过调用的方法的形式来间接调用函数,它们第一个实参是要调用函数的母对象,它调用上下文在函数体内通过this来获得对它的引用。
使用:
var a = 0;
function b(){
console.log(this.a);
}
var c = {}; // 创建空对象
c.a = 1; // 空对象里面添加一个值
c.d = b; // 然后再把b的函数拿过来
c.d.apply(); // 无参数 print⇒ 0 apply改变了b内的this,使其为全局对象。
c.d.apply(c); // 参数c 把c.d里面的函数this改为c 此时得出结果 c.a的值
// apply
function Preson(name,age){
this.name = name;
this.age = age;
this.weight = function(){
console.log("120");
}
}
function Student(name,age,weight){
Preson.apply(this,[name,age]); // Preson的this指向了Student且把参数也带了过来
this.weight = weight; // Student的weight拿到Preson的weight
}
var result = new Student('小明','18'); // 这里new Student 所以this指向Student函数
result.weight(); // 120
console.log(result.name); // 小明
// call
function Student1(name,age,weight){
Preson.call(this,name,age); // 只是传参形式不同 其他相同
this.weight = weight;
}
// new 与apply 相同
函数的prototype属性:
每一个函数都包含一个prototype,指向一个对象引用,这个对象叫做原型对象。
每个函数都包含不同的原型对象。当函数用做构造函数的时候,新建的对象会从原型对象上继承。
bind()方法:
将函数绑定至某个对象。返回新的函数。
var a = {
b:function(){
var c = function(){
console.log(this.d); // 闭包了 获取不到d值 需要在函数外定义this
}
c(); // 调用也没用
}
d:'123'
}
a.b(); //undefined
我们来解决上面的问题吧:
var a = {
b:function(){
var c = function(){
console.log(this.d);
}.bind(this); // 这里直接用bind绑定this给函数
c();
}
d:'123'
}
a.b(); // 123
另一种解决办法:
var a = {
b:function(){
var c = function(){
console.log(this.d);
}
c.bind(this)(); // 这里调用前bind绑定this给c函数
}
d:'123'
}
a.b(); // 123
另一种使用方法:
function f(x,y){
return this.s + x + y;
}
var m = f.bind({s:1},2,3); // 第一个实参绑定给函数体内的this 所以this指向this.s
console.log(m()); // print==>6
最后一种:
var a = document.write;
a('1'); // 报错
a.bind(document)('123'); // 123 this绑定到document对象。