Javascript函数详解。

函数:

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对象。

猜你喜欢

转载自blog.csdn.net/weixin_44164824/article/details/89031277