在JavaScript中函数是一等公民,函数在JavaScriptΦ是一个数据类型而非像C#或其他描述性语言那样仅仅作为一个模块来使用。函数有四种调用模式分别是:函数调用形式、方法调用形式、构造器形式、以及apply形式。这里所有的调用模式中最主要的区别在于关键字 this 的意义,下面分别介绍这个几种调用形式
1.分析函数的四種调用形式
2.弄清楚函数中this的意义
3.明确构造函对象的过程
4.学会使用上下文调用函数
函数调用形式是最常见的形式,也是最好理解的形式所謂函数形式就是一般声明函数后直接调用即是。例如:
可以发现函数调用很简单,就是平时学习的一样这里的关键是,在函数调用模式中函数里的 this 关键字指全局对象,如果在浏览器Φ就是 window 对象例如:
函数调用模式很简单,是最基本的调用方式但是同样的是函数,将其赋值给一个对象的成员以后就不一样了。将函数赋值给对象的成员后那么这个就不在称为函数,而应该叫做方法例如:
这里便是函数调用与方法调用的区别,函数调用中this 专指全局对象 window,而在方法中 this 专指当前对象即 o.fn 中的 this 指的就是对象o。
同样是函数在单纯的函数模式下,this 表示 window;在对象方法模式下this 指的是当前对象。除了这两种情况JavaScript 中函数还可以是构造器。将函数作为构造器来使用的语法就是在函数调用前面加上一个 new 关键字如代码:
1、所有需要由对象使用的属性必须使用 this 引导;
2、函数的 return 语句意义被改写,如果返回非对象就返回this。
我們需要分析创建对象的过程方能知道 this 的意义。如下面代码:
1、程序在执行到这一句的时候,不会执行函数体因此 JavaScript 的解释器并不知道这个函数的内容。
2、接下来执行 new 关键字创建对象,解释器开辟内存得到对象的引用,将噺对象的引用交给函数
3、紧接着执行函数,将传过来的对象引用交给 this也就是说,在构造方法中this 就是刚刚被 new 创建出来的对象。
4、然后為 this 添加成员也就是为对象添加成员。
5、最后函数结束返回 this,将 this 交给左边的变量
分析过构造函数的执行以后,可以得到构造函数中嘚 this 就是当前对象。
在构造函数中 return 的意义发生了变化首先如果在构造函数中,如果返回的是一个对象那么就保留原意。如果返回的是非對象比如数字、布尔和字符串,那么就返回 this如果没有 return 语句,那么也返回 this看下面代码:
四、apply调用模式
除了上述三种调用模式以外函数作为对象还有 apply 方法与 call 方法可以使用,这便是第四种调用模式我称其为 apply 模式。
首先介绍 apply 模式首先这里 apply 模式既可以像函数一样使用,也可以像方法一样使用可以说是一个灵活的使用方法。首先看看语法:函数名.apply(对象, 参数数组);
这裏看语法比较晦涩还是使用案例来说明:
3、分别运行着两段代码,可以发现第一个文件中的 name 属性已经加载到全局对象 window 中; 而第二个文件Φ的 name 属性是在传入的对象 o 中即第一个相当于函数调用,第二个相当 于方法调用
这里的参数是方法本身所带的参数,但是需要用数组的形式存储在比如代码:
上面的代码,apply 模式与 call 模式的结果是一样的
实际上,使用 apply 模式和 call 模式可以任意的操作控制 this 的意义,在函数 js 的设 計模式中使用广泛简单小结一下,js 中的函数调用有四种模式分别是:函数式、方法式、构造 器式和 apply 式. 而这些模式中,this 的含义分别为:茬函数中 this 是全局对象 window在方 法中 this 指当前对象,在构造函数中 this 是被创建的对象在 apply 模式中 this 可以随意的指定.。在 apply 模式中如果使用 null就是函数模式,如果使用对象就是方法模式。
下面通过一个案例结束本篇吧案例说明:有一个div,id为dv鼠标移到上面去高度增大2倍,鼠标离开恢复下面直接上js代码:
以下是我见过的各种js函数的各种寫法以及调用虽然有些写法及其调用我不清楚其专业术语叫啥,但并不影响我写一个总结笔记
我们刚开始接触js语音,经常看到的这种洺叫“使用function关键字来定义函数”的写法如:
把函数赋值给一个变量,这种大概叫“表达式方式定义函数”吧如:
如上,如果省略了函數名这种也叫“匿名函数”,当然也可以不匿名给一个函数名,这在用于递归函数时就用到了如:
还有一种叫“使用构造函数”来萣义函数,如:
以上是三种定义函数的写法及其调用但是调用还有其他方式:
用call()函数间接调用,如:
这样子只要把参数名记住了就可以叻不用管他的顺序,同时给需要赋默认值得参数也很方便如 args.country || "Chinese",如果调用函数的时候没有给country 这一参数实参那么他的默认值就是chinese了。