关于JS,这两者有什么区别?我知道方法与对象有关,但是混淆了函数的用途是什么?每个语法的语法有何不同?
另外,这两种语法之间的区别是什么:
var myFirstFunc = function(param) {
//Do something
};
和
function myFirstFunc(param) {
//Do something
};
另外,在使用函数之前,我在某处看到了我们需要做的事情:
obj.myFirstFunc = myFirstFunc;
obj.myFirstFunc("param");
为什么需要第一行,它有什么作用?
很抱歉,如果这些是基本问题,但我从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;
答案 0 :(得分:35)
回答你的标题问题''功能'和'方法'之间的区别。
这是语义,与你想要表达的内容有关。
在javascript中,每个函数都是一个对象。对象是键:值对的集合。如果值是基元(整数,字符串,布尔值)或其他对象,则该值被视为属性。如果值是函数,则称为“方法”。
在对象的范围内,函数被称为该对象的方法。它是从对象命名空间'MyObj.theMethod()'调用的。由于我们说函数是一个对象,函数中的函数被认为是该函数的一种方法。你可以说我将使用我的对象的保存方法。或者您可以说,“保存方法接受函数作为参数”。但是你通常不会说函数接受一个方法作为参数。
BTW Stoyan Stefanov的书籍Javascript模式详细介绍了你的问题,如果你真的想要理解这门语言,我强烈推荐它。这是关于这个主题的书的引用。
因此,作为对象的函数A可能会发生属性和方法 其中恰好是另一个函数B.然后B可以接受函数C作为 参数和执行时,可以返回另一个函数D.
答案 1 :(得分:12)
存在细微差别 -
方法:方法是与对象关联的函数。
var obj = {
name : "John snow",
work : function someFun(paramA, paramB) {
// some code..
}
功能:当没有与之关联的对象时,它就会起作用。
function fun(param1, param2){
// some code...
}
答案 2 :(得分:1)
您的第一行是创建引用函数的对象。你会像这样引用它:
myFirstFunc(param);
但是你可以将它传递给另一个函数,因为它会像这样返回函数:
function mySecondFunction(func_param){}
mySecondFunction(myFirstFunc);
第二行只是创建一个名为myFirstFunc
的函数,它将被引用如下:
myFirstFunc(param);
并且在范围上受限于其声明的位置,如果它在任何其他函数之外声明它属于全局范围。但是,您可以在另一个函数内声明一个函数。然后该函数的范围仅限于其声明的函数。
function functionOne(){
function functionTwo(){}; //only accessed via the functionOne scope!
}
您的最后一个示例是创建函数实例,然后通过对象参数引用它们。所以这个:
function myFirstFunc(param){};
obj.myFirst = myFirstFunc(); //not right!
obj.myFirst = new myFirstFunc(); //right!
obj.myFirst('something here'); //now calling the function
表示您有一个引用函数实例的对象。这里的关键是,如果函数更改了引用,则不会更改存储在obj.myFirst
中的内容。
虽然@kevin基本上是正确的,但只有JS中的函数可以创建更像方法然后函数的函数,例如:
function player(){
this.stats = {
health: 0,
mana: 0,
get : function(){
return this;
},
set : function( stats ){
this.health = stats.health;
this.mana = stats.mana;
}
}
然后,您可以致电player.stats.get()
,它会返回heath
和mana
的值。因此,我认为此实例中的get
和set
是player.stats
对象的方法。
答案 3 :(得分:1)
方法是对象的属性,其值是函数。在对象上以以下格式调用方法:object.method()。
//这是一个名为developer
的对象 const developer = {
name: 'Andrew',
sayHello: function () {
console.log('Hi there!');
},
favoriteLanguage: function (language) {
console.log(`My favorite programming language is ${language}`);
}
};
// favoriteLanguage:和sayHello:和name:所有这些都属于名为developer的对象
现在让我们说您需要调用“最喜欢的语言”。女巫是对象内部的一个函数。
您这样称呼
developer.favoriteLanguage('JavaScript');
// My favorite programming language is JavaScript'
因此我们将其命名为:developer.favoriteLanguage('JavaScript'); 它不是功能,不是对象吗?这是什么?是一种方法
答案 4 :(得分:0)
var myFirstFunc = function(param) {
//Do something
};
和
function myFirstFunc(param) {
//Do something
};
(几乎)相同。第二个(通常)只是简写。但是,正如这个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
您展示的确切语法是因为您也可以这样做:
function abc( ) {
this.test = 2;
}
var obj = {};
obj.func = abc;
obj.func( ); // sets obj.test to 2
但你应该没有充分的理由。
答案 5 :(得分:0)
函数执行语句列表示例:
function add() {
var a = 2;
var b = 3;
var c = a + b;
return c;
}
1)方法是一个应用于对象示例的函数:
var message = "Hello world!";
var x = message.toUpperCase(); // .toUpperCase() is a built in function
2)使用对象构造函数创建方法。一旦该方法属于该对象,您就可以将其应用于该对象。例如:
function Person(first, last, age, eyecolor) {
this.firstName = first;
this.lastName = last;
this.age = age;
this.eyeColor = eyecolor;
this.name = function() {return this.firstName + " " + this.lastName;};
}
document.getElementById("demo").innerHTML = person.fullName(); // using the
method
方法的定义:方法是作为函数的对象的属性。方法定义为定义普通函数的方式,除了必须将它们指定为对象的属性。
答案 6 :(得分:0)
许多答案都在说一种方法是在对象上定义函数时要调用的函数。
尽管人们通常在谈论JavaScript或面向对象的编程时通常会使用该词,但请注意,在ES6中,术语方法具有非常特殊的含义(请参见规范的here部分)。
方法(严格意义上来说)是通过对象文字中的简洁方法语法或类声明/表达式中的类方法定义的函数:
// In object literals:
const obj = {
method() {}
};
// In class declarations:
class MyClass {
method() {}
}
此14.3 Method Definitions很好地概述了方法的特异性(严格意义上),即:
[[HomeObject]]
属性,使他们可以使用super
。prototype
属性创建的,并且它们没有内部的[[Construct]]
方法,这意味着它们无法使用new
进行调用。下面是一些示例,这些示例说明了方法(严格意义上)与通过函数表达式在对象上定义的函数有何不同:
const obj = {
method() {
super.test; // All good!
},
ordinaryFunction: function ordinaryFunction() {
super.test; // SyntaxError: 'super' keyword unexpected here
}
};
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
const obj = {
method() {
console.log( method );
},
ordinaryFunction: function ordinaryFunction() {
console.log( ordinaryFunction );
}
};
obj.ordinaryFunction() // All good!
obj.method() // ReferenceError: method is not defined
答案 7 :(得分:0)
4.3.31方法: 功能就是属性的值
注意当将函数作为对象的方法调用时,该对象为 传递给该函数的this值。
非常清楚:当您调用某个函数时,如果它隐式具有一个this
(指向一个对象),并且如果您不能在没有对象的情况下调用该函数,则< strong>该功能应命名为方法。