咏竹莉
where there is a will,there is a way

函数调用的方法一共有4种:

1.  作为个函数调用

2. 函数作为方法调用

3. 使用构造函数调用

4. 作为函数方法调用

 

作为一个函数调用

// 作为一个函数调用
var name = "windowsName";
function a() {
    var name = "Cherry";
    console.log(this.name);     // windowsName
    console.log('inner:' + this);  // inner: Window
}
a();
console.log('outer:' + this);     // outer: Window

这样一个简单的函数,不属于任何一个对象,就是一个函数,这样的情况在js非严格模式默认是属于全局对象window的,在严格模式,就是undefined。

 

函数作为方法调用

更多的情况是将函数作为对象的方法使用

var name = "windowsName"
var a = {
    name: 'Cherry',
    fn: function(){
         console.log(this.name);     //Cherry
     }
}

a.fn();  

这里定义一个对象a,对象a有一个属性name和一个方法fn

然后对象 a 通过. 方法调用了其中的fn方法

 

使用构造函数调用函数

如果函数调用前使用了new关键字,则是调用了构造函数。

这看起来就像创建了新的函数,但实际上js函数是重新创建的对象

 

// 构造函数
function myFunction(arg1,arg2) {
    this.firstName = arg1; 
    this.lastName = arg2;
}

// this creates a new object
var a = new myFunction('Li','Cherry');
a.lastName  // 返回'Cherry'

 

作为函数方法调用函数

在js中,函数是对象。
js函数有它的属性和方法。
call() 和 apply() 是预定义的函数方法。两个方法可用于调用函数,两个方法的第一个参数必须是对象本身

在js严格模式下,在调用函数时第一个参数会成为this的值,即使该参数不是一个对象。
在js非严格模式下,如果第一个参数的值是null或undefined, 它将使用全局对象代替

 

var name = "windowsName";
function fn() {
   var name = 'Cherry';
   innerFunction();
   function innerFunction() {
      console.log(this.name);     // windowsName
   }
}

fn()

这里的innerFunnction() 的调用属于第一种调用方式: 作为一个函数调用(它是作为一个函数调用的,没有挂载在任何对象上,所有对于没有挂载在任何对象上的函数,在非严格模式下this就是指向window)

 

posted on 2021-06-10 17:57  咏竹莉  阅读(833)  评论(0)    收藏  举报