理解JavaScript函数声明语法

时间:2013-12-22 06:23:35

标签: javascript

使用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对象有关?

4 个答案:

答案 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关键字。你能给出定义PersonSpeak函数的代码的(外部)范围吗?你写的代码不会像写的那样工作。如果您想在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}

    这是一个分配给范围变量

    的声明
    • 如果您在全局区域,它将被分配(例如在浏览器中)到窗口对象  所以实际上window [“myFunction”]()是有效的


*关于这个问题......

 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()...