我试图理解JavaScript中两个不同函数声明之间的区别。
请考虑以下代码段:
function SomeFunction(){
this.func1 = function(){
}
function func2(){
}
}
上面的func1和func2的声明有什么区别?
答案 0 :(得分:4)
用简单的语言,
fun1
是SomeFunction
类的属性,其中包含匿名函数的引用,其中func2
被命名为function。
<强>属性强>
这里fun1
是SomeFunction
类的属性,这意味着当您使用new关键字创建SomeFunction类的实例时,只有您可以从外部访问它。
隐私方法
此处fun2
将作为类SomeFunction
的私有方法,并且只能在该类中访问。
<强>示例强>
function SomeFunction() {
this.func1 = function() { console.log("in func1") }
function func2() { console.log("in func2") }
}
var obj = new SomeFunction();
obj.func1(); //Accessible
obj.func2(); //Not accessible
答案 1 :(得分:2)
function SomeFunction() {
// Function Expression
this.func1 = function() {
}
// Function Declaration
function func2() {
}
}
<强>更新强>
根据您的问题: 在Javascript类中声明函数的最佳方法是什么?
在OOP编程中,Class具有属性和方法。
在以下示例代码中,Person类包含:
(2)属性:
(1)方法:
function Person(name, country) {
// Attributes of Person class.
this.name = name;
this.country = country;
// Function Expression:
this.showPerson1 = function() {
var personMessage = "Hi, my name is ";
personMessage += this.name;
personMessage += ". I'm from ";
personMessage += this.country;
personMessage += ".";
return personMessage;
};
// Function Declaration:
function showPerson2() {
var personMessage = "Hi, my name is ";
personMessage += this.name;
personMessage += ". I'm from ";
personMessage += this.country;
personMessage += ".";
return personMessage;
}
}
var person1 = new Person("John", "United States");
console.log(person1.showPerson1()); // Prints: Hi, my name is John. I'm from United States.
console.log(person1.showPerson2()); // Throws an error.
如您所见,您可以执行showPerson1()
方法,因为使用 this
关键字并使用函数表达式样式来引用Person类。
但是,您无法执行showPerson2()
方法,因为此函数的创建方式与对Person类的引用不同。
您可以找到更多信息here。
答案 2 :(得分:1)
据我所知,你的问题围绕着范围。让我们说一下你有一个主类调用其他类的函数。也许这些其他类有一个你需要使用的名为 func1 的函数。但是等等,你想在你的主类中使用名称 func1 而不提及其他类的全局函数。使用 this.func1 将允许您作为本地函数访问它,因为.this是指本地范围。
基本上,它允许他存储函数的结果而不声明一个单独的变量,这很好,因为它可能只是临时使用并且在声明它的函数的上下文中。
额外阅读(或者在我的比喻失败的情况下):
http://javascriptissexy.com/understand-javascripts-this-with-clarity-and-master-it/ https://www.w3schools.com/js/js_function_invocation.asp
答案 3 :(得分:1)
这种声明函数的方式称为函数表达式。只有在定义函数后才能调用这种函数。函数表达式仅在解释器到达该行代码时加载。
var func1 = function() {
// Code here
}
这种声明函数的方式称为函数声明。函数声明在执行任何代码之前加载。所以它可以在程序定义之前在程序中的任何地方调用。有理由,请阅读Javascript中的Hoisting
func1 () {
// Code here
}
在另一个函数中定义这些函数时,函数表达式充当函数的属性,可以使用父函数的对象进行访问。然而,函数声明的范围在父函数内部,因此无法从父函数外部访问它。这是Javascript中非常重要的属性,我们可以模拟 面向对象的自然。
简而言之,函数声明充当类的私有方法,函数表达式充当公共方法。
以下是下面的工作示例,以了解有关它的更多信息。
function SomeFunction(){
this.func1 = function() {
console.log('Public function.')
}
function func2() {
console.log('Private function.')
}
this.func3 = function() {
func2();
}
}
var obj = new SomeFunction();
obj.func1(); // Public Function.
// Can be accessed as it is a Public function
obj.func3(); // Private Function.
// Can be used to access a private function.
obj.func2(); // Error: Uncaught TypeError
// Private function
&#13;
希望这有帮助! :)
答案 4 :(得分:0)
func1
实际上是SomeFunction
上的属性,所以基本上你可以做
const someClass = new SomeFunction();
someClass.func1()
但你做不到
const someClass = new SomeFunction();
someClass.func2()
因为它没有附加到该类。但是,您仍然可以在班级func2
内部使用SomeFunction
,但不能在课堂外使用。{/ p>
ES6提供了更清晰的语法来理解这一点。
class SomeClass{
func1(){
//function body
}
}
希望这有帮助