函数:它只定义一次,但可能被执行或者调用任意次。
在Javascript里面 函数即对象
函数定义
函数关键字function
函数名称标识符:
一对圆括号(),其中由0个或者多个用逗号隔开的标识符组成列表。
一对花括号{} 其中包含好多Javascript语句,这些语句构成函数图:
function prop(x){ for(o in x){console.log(o+”:”+x[o]+”\n”)}}
undefined
prop({x:1,y:2,z:3})
x:1
y:2
z:3
函数的调用
- 作为函数
- 作为方法
- 作为构造函数
- 通过它们的call()和apply()方法间接调用。
方法调用
var bar={x:1,y:2,z:function(x){return x}}
undefined
bar.z
(x){return x}
bar.z();
undefined
bar.z(3);
3
函数的实参和形参
可选形参
当调用函数的时候传入的实参比函数的声明时指定的形参个数少的时候,剩下的形参都将设置
/* optional*/
可变成的实参列表,实参对象=arguments
函数,方法,构造函数。
函数就是值,对函数执行type of会返回“function” 但是函数在javascript中是特殊的对象,因为函数也是对象。它们也由属性和方法
length属性
arguments。length表示传入的函数的实参的个数
prototype属性
每个函数都包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称作原型对象。每个函数都包含不同的原型对象。
call()方法和apply()
我们可以将这俩个方法看作是某个对象的方法,通过调用方法的形式间接来调用函数,它俩的第一个参数是要调用函数的母对象,它是上下文,在函数体内通过this来获得对它的引用,
function f(){return “hello word”};
undefined
f.call();
“hello word”
function f(){return this};
undefined
f.call();
Window {speechSynthesis: SpeechSynthesis, caches: CacheStorage, localStorage: Storage, sessionStorage: Storage, webkitStorageInfo: DeprecatedStorageInfo…}
newtab-serviceworker.js:1 Service Worker termination by a timeout timer was canceled because DevTools is attached.
var bar={x:1,y:2,z:function(x){return x}}
undefined
f.call(bar);
Object {x: 1, y: 2}
call()和apply()的第一个实参都会变成this的值,哪怕传入的实参是原始值甚至是null或undefinder都会被全局对象代替,而其他原始值则会呗相应的包装对象所代替。
Function()构造函数
不管是通过函数定义语句还是函数直接量表达式,函数的定义都是使用function关键字,但函数还可以使用Function()构造函数来定义,比如
var a=new Function();
this 的使用
this是Javascript语言的一个关键字。
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用
如下
随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。
function test() {
this.x = 0;
alert(this.x)
}
这里最后输出0
四中情况来讨论this:
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
function test(){
this.x = 1;
alert(this.x);
}
test(); // 1
修改代码如下:
var x = 1;
function test() {
// this.x = 0;
alert(this.x)
}
test(); //1
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this就指这个上级对象。
function test() {
//此時的this就是o对象
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); //1
情况三 作为构造函数调用
所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。
function test(ss) {
this.x=11;
}
var test=new test(22)
alert(test.x) //输出11
代码修改一下:
var x = 22;
function test(ss) {
this.x = 11;
}
var test = new test(22)
alert(x) //输出22 说明全局变量没有改变
情况四 使用call方法和apply方法
我们将call()和apply()看作是某个对象的方法,通过调用方法的形式来间接的调用函数,call()和apply()方法的第一个实参是要调用函数的母对象,它是上下文,在函数体内通过this来获取对它的引用。
var x = 2;
function test() {
alert(this.x)
}
var o = {};
o.x = 1;
test.call();//输出2,此时的this代表全局变量,在call方法中第一个参数是null或者undefined都会被全局对象代替。
修改代码:
var x = 2;
function test() {
alert(this.x)
}
var o = {};
o.x = 1;
test.call(o); //输出1 此时的this代表的就是当前o的对象
JavaScript的函数简单的学习到此为止,以后再深入的学习