使用JavaScript一段时间后,我想出了一些问题。
声明一个函数的方法是:
var myFunction = function(param){//code here}
但是还有另一种方法来声明一个
的函数function myFunction(param){//some code}
声明函数的两种方法有什么区别?
我的第二个问题是,我知道你可以从声明为的函数创建一个对象:
function Person(name){this.name=name;}
然后,您可以使用另一个声明的函数:
function Speak(){console.log(this.name);}
Speak函数如何知道它与Person
对象有关?
答案 0 :(得分:1)
第一个是表达式
var myFunction = function(param){//code here}
其次是声明
function myFunction(param){//some code}
看到这篇文章 http://kangax.github.io/nfe/
答案 1 :(得分:0)
当你使用单词var时,你的声明变量可以实现它的定义,并且不能从外面加入,如果它在函数内部,它会在执行结束时被破坏,如果你不这样做使用它,你在全局范围内定义,并且在函数执行后变量仍然存在。
第二件事是编程OOP
Yo可以使用与纯对象相同的功能:
var person = {
name: null,
setName: function (name) {
this.name = name
}
}
然后你可以访问它的属性
person.setName('john');
console.log(person.name);
以函数的形式
function Person(name){
this.name = null;
}
var john = new Person('John');
console.log(john.name);
答案 2 :(得分:0)
使用此语法时:
function f1(){}
然后f1可以在当前范围内的任何地方使用:
// we can call f1 even before definition of the function
f1(); // it works
function f1(){}
但是,当我们使用这种语法时:
var f1 = function(){};
然后f1就像一个指向匿名函数的指针,可以在赋值点之后使用:
// we can't call it before assignment of our var
//f1(); // f1 is undefined here!
var f1 = function(){}
// we can call it here
f1(); // works
当您考虑每个函数也是一个对象时,第二种语法更有意义。例如,我们可以将一个函数作为对象的属性,如下所示:
var myObject = new Object();
myObject.say = function(x) {alert(x);};
// myObject now has a property/method named "say"
myObject.say("Hello");
关于第二个问题:this
关键字。你能给出定义Person
和Speak
函数的代码的(外部)范围吗?你写的代码不会像写的那样工作。如果您想在Speak函数中为this
设置正确的引用,您必须编写如下内容:
function Person(name){ this.name=name; }
function Speak(){ alert(this.name); }
Person.prototype.DoSpeak = Speak; //here we attach DoSpeak to Speak function
var p = new Person("Saeed");
p.DoSpeak(); //this will work
答案 3 :(得分:0)
两者都是声明
1)var myFunction = function(param){// code here}
这是一个分配给'myFunction'局部变量
的声明您可以为调试或递归目的设置该函数的标识符
var myFunction = function myFunctionIdentifier(param){console.log(myFunctionIdentifier.toString())}
但要调用此函数,您必须使用'myFunction'变量
执行嵌套调用的另一种方法是使用指向函数本身的arguments.callee
var myFunction = function(param){console.log(arguments.callee.toString())}
2)函数myFunction(param){// some code}
这是一个分配给范围变量
的声明
*关于这个问题......
function Person(name){this.name=name;}
function Speak(){console.log(this.name);}
Speak'知道'人名的原因与JavaScript范围有关。 由于两者都使用相同的范围,因此两种功能都“相同”。 例如:如果您在全局范围内对两个函数进行编码,则此== window对象 的console.log(窗口[ '名称']);会给你这个名字。
您不希望以这种方式编码..因为使用this.name的另一个函数将覆盖您现有的逻辑。 如果要实例化Person实体 var person = new Person(); 那么person变量就是这个,这个== person对象 你可以用两种或多种方式分配Speak:
内联:
function Person(){
...
this.Speak =功能......
}
在代码之外,因为此人分配给(人) person.Speak = function()...
或最好的方法,使用原型对象:
Person.prototype.Speak = function()...