← 返回首页
Javascript基础教程(十六)
发表时间:2020-03-28 01:46:40
讲解函数与方法的区别

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:张三