方法与功能,以及其他问题

Kar*_*oel 34 javascript methods function

关于JS,这两者有什么区别?我知道方法与对象有关,但是混淆了函数的用途是什么?它们的语法有何不同?

另外,这两种语法之间的区别是什么:

var myFirstFunc = function(param) {
    //Do something
};
Run Code Online (Sandbox Code Playgroud)

function myFirstFunc(param) {
    //Do something
};
Run Code Online (Sandbox Code Playgroud)

另外,在使用函数之前,我在某处看到了我们需要做的事情:

obj.myFirstFunc = myFirstFunc;
obj.myFirstFunc("param");
Run Code Online (Sandbox Code Playgroud)

为什么需要第一行,它有什么作用?

对不起,如果这些是基本问题,但我开始使用JS而且很困惑.

编辑:对于最后一点代码,这就是我所说的:

// here we define our method using "this", before we even introduce bob
var setAge = function (newAge) {
  this.age = newAge;
};
// now we make bob
var bob = new Object();
bob.age = 30;
// and down here we just use the method we already made
bob.setAge = setAge;
Run Code Online (Sandbox Code Playgroud)

mas*_*sta 42

回答你的标题问题''功能'和'方法'之间的区别.

这是语义,与你想要表达的内容有关.

在javascript中,每个函数都是一个对象.对象是键:值对的集合.如果值是基元(整数,字符串,布尔值)或其他对象,则该值被视为属性.如果值是函数,则称为"方法".

在对象的范围内,函数被称为该对象的方法.它是从对象命名空间'MyObj.theMethod()'调用的.由于我们说函数是一个对象,函数中的函数被认为是该函数的一种方法.你可以说我将使用我的对象的save 方法.或者你可以说,"save方法接受一个函数作为参数".但是你通常不会说函数接受一个方法作为参数.

顺便提一下Stoyan Stefanov的书Javascript Patterns 详细介绍了你的问题,如果你真的想要理解这门语言,我强烈推荐它.这是关于这个主题的书的引用.

因此,作为对象的函数A可能会发生属性和方法,其中一个恰好是另一个函数B.然后B可以接受函数C作为参数,并且在执行时可以返回另一个函数D.

  • 原语是数字、字符串、布尔值 (2认同)

小智 18

真实没有区别,但两者都有区别:

方法:方法是与对象关联的函数.

var obj = {
name : "John snow",
work : function someFun(paramA, paramB) {
    // some code..
}
Run Code Online (Sandbox Code Playgroud)

功能:当没有与之关联的对象时,它就会起作用.

function fun(param1, param2){
// some code...
}
Run Code Online (Sandbox Code Playgroud)


Oli*_*eke 16

许多答案都在说,方法就是在对象上定义时调用的函数。

虽然当人们谈论 JavaScript 或一般的面向对象编程时,这个词的使用方式通常是这样的(请参阅此处),但值得注意的是,在 ES6 中,术语方法具有非常具体的含义(请参阅第14.3方法规范的定义)。


方法定义

(严格意义上的)是通过在对象文本或作为在类声明/表达的一类方法的简明方法的语法定义的函数:

// In object literals:
const obj = {
    method() {}
};

// In class declarations:
class MyClass {
    method() {}
}
Run Code Online (Sandbox Code Playgroud)

方法特性

这个答案很好地概述了方法的特殊性(严格意义上),即:

  1. 方法被分配了一个内部[[HomeObject]]属性,允许它们使用super.
  2. 方法不是用prototype属性创建的,也没有内部[[Construct]]方法,这意味着它们不能用new.
  3. 方法的名称不会成为方法范围内的绑定。

下面是一些示例,说明方法(严格意义上的)与通过函数表达式定义在对象上的函数有何不同:

示例 1

// In object literals:
const obj = {
    method() {}
};

// In class declarations:
class MyClass {
    method() {}
}
Run Code Online (Sandbox Code Playgroud)

示例 2

const obj = {
    method() {
        super.test;         // All good!
    },
    ordinaryFunction: function ordinaryFunction() {
        super.test;         // SyntaxError: 'super' keyword unexpected here
    }
};
Run Code Online (Sandbox Code Playgroud)

示例 3

const obj = {
    method() {},
    ordinaryFunction: function ordinaryFunction() {}
};

console.log( obj.ordinaryFunction.hasOwnProperty( 'prototype' ) );  // true
console.log( obj.method.hasOwnProperty( 'prototype' ) );            // false

new obj.ordinaryFunction();     // All good !
new obj.method();               // TypeError: obj.method is not a constructor
Run Code Online (Sandbox Code Playgroud)

  • 优秀的现代答案 (2认同)

Dav*_*ave 0

var myFirstFunc = function(param) {
    //Do something
};
Run Code Online (Sandbox Code Playgroud)

function myFirstFunc(param) {
    //Do something
};
Run Code Online (Sandbox Code Playgroud)

(几乎)相同。第二个(通常)只是简写。然而,正如这个jsfiddle(http://jsfiddle.net/cu2Sy/)所示,function myFirstFunc一旦进入封闭范围就会导致函数被定义,而只有myFirstFunc = function在执行到达该行时才会创建它。

至于方法,它们有一个this参数,即当前对象,因此:

var obj = {};
obj.func = function( ) {
    // here, "this" is obj
    this.test = 2;
}
console.log( obj.test ); // undefined
obj.func( );
console.log( obj.test ); // 2
Run Code Online (Sandbox Code Playgroud)

您显示的确切语法是因为您也可以这样做:

function abc( ) {
    this.test = 2;
}
var obj = {};
obj.func = abc;
obj.func( ); // sets obj.test to 2
Run Code Online (Sandbox Code Playgroud)

但你不应该没有充分的理由。