1.javascript中函数和方法的区别
函数(function)是一段代码,需要通过名字来进行调用。它能将一些数据(函数的参数)传递进去进行处理,然后返回一些数据(函数的返回值),也可以不返回数据。
方法(method)是通过对象调用的javascript函数。也就是说,方法也是函数,只是比较特殊的函数。
当将函数和对象和写在一起时,函数(function)就变成了方法(method)。也就是说函数和方法本质上是一样的,只不过方法是函数的特例,是将函数赋值给了对象。
例如:
<script>
//下面定义的是函数
function sayHello(){
console.log('hello,world!');
}
let person = {
name: '张三',
age :20,
//下面定义的是方法
sayHello:function(){
console.log('hello,world!');
}
}
sayHello(); //调用函数
person.sayHello(); //调用方法
</script>
运行结果:
hello,world!
hello,world!
2.this指向问题
JavaScript的函数内部如果调用了this,那么这个this到底指向谁?
答案是,视情况而定。
我们来看下面的例子:
<script>
//下面定义的是函数
function sayHello() {
console.log('hello,world!,my name is:' + this.name);
}
let person = {
name: '张三',
age: 20,
//hello方法指向sayHello
hello: sayHello
}
person.hello();
sayHello();
</script>
运行结果:
hello,world!,my name is:张三
hello,world!,my name is:
我们发现当我们单独调用sayHello()方法时,并没有输出姓名。原因是此时的this指针并不是指向person对象,而是指向全局对象,也就是window对象。
我们可以使用apply指定函数的this指向哪个对象。例如:
<script>
//下面定义的是函数
function sayHello() {
console.log('hello,world!,my name is:' + this.name);
}
let person = {
name: '张三',
age: 20,
//hello方法指向sayHello
hello: sayHello
}
person.hello.apply(person,[]);
sayHello.apply(person,[]);
</script>
运行结果:
hello,world!,my name is:张三
hello,world!,my name is:张三
另一个与apply()类似的方法是call(),唯一区别是:
apply()把参数打包成Array再传入;
call()把参数按顺序传入。
上例可改写成如下:
<script>
//下面定义的是函数
function sayHello() {
console.log('hello,world!,my name is:' + this.name);
}
let person = {
name: '张三',
age: 20,
//hello方法指向sayHello
hello: sayHello
}
person.hello.call(person,null);
sayHello.call(person,null);
</script>
运行结果:
hello,world!,my name is:张三
hello,world!,my name is:张三
apply和call的第二个参数是args,表示调用方法时,传入的参数数组。可以使用arguments 获取该参数。
例如:
<script>
//下面定义的是函数
function sayHello() {
console.log(arguments)
console.log('hello,world!,my name is:' + this.name);
}
let person = {
name: '张三',
age: 20,
//hello方法指向sayHello
hello: sayHello
}
person.hello.apply(person,['aaa','bbb','ccc']);
sayHello.apply(person,['aaa','bbb','ccc']);
person.hello.call(person,'aaa','bbb','ccc');
sayHello.call(person,'aaa','bbb','ccc');
</script>
运行结果:
Arguments(3) ['aaa', 'bbb', 'ccc', callee: ƒ, Symbol(Symbol.iterator): ƒ]
hello,world!,my name is:张三
Arguments(3) ['aaa', 'bbb', 'ccc', callee: ƒ, Symbol(Symbol.iterator): ƒ]
hello,world!,my name is:张三
Arguments(3) ['aaa', 'bbb', 'ccc', callee: ƒ, Symbol(Symbol.iterator): ƒ]
hello,world!,my name is:张三
Arguments(3) ['aaa', 'bbb', 'ccc', callee: ƒ, Symbol(Symbol.iterator): ƒ]
hello,world!,my name is:张三