对javascript函数表达感到困惑

时间:2017-06-13 21:18:31

标签: javascript function

我刚刚开始学习javascript等,我从朋友那里得到一个项目来看看它,我看到的是他们一直使用javascript函数作为函数表达式,如下所示:

var a = function(Id) {
    //Do something here
}

我可以说好的,他们就像那样工作,我会像机器人一样工作,即使我不明白为什么会那样......

所以我想知道这是什么意思,(在我上面发布的代码中)是一个名为“a”的函数,它在我们的例子中期待一个名为“Id”的参数,所以我可以点击一些按钮来调用它例如,或者这个var a是实际可变的,它被称为“a”,但它可能被称为函数,实际上它是一个javascript函数?

这里有点让我感到困惑,我在这个项目中看到几乎所有的javascrit函数都是这样使用的,但是这是一个正确的方法,或者它们应该使用命名函数表达式,所以它看起来像这样:

var a = function myFunction(Id) {
    //Do something here
}

那现在是什么?我创建了一个名为myFunction的函数,它期望一个名为“Id”的参数,它可以通过myFunction点击并调用“a”变量来调用? (如果它是可变的,或者它也是函数名或其他)..

谢谢你们 干杯

1 个答案:

答案 0 :(得分:1)

理解这一点的关键在于,在JavaScript中,函数就是数据,就像其他任何函数一样。所以,如果你理解这一点:

var x = 10;

如果您尝试获取x的值,则会获得10

console.log(x);

然后,了解这并不是一件容易的事情:

var x = function(){
   // do something
}

如果您尝试在此处获取值,您将获得该函数的实际文本:

console.log(x); // function(){ // do something }

由于最后一个版本检索了一个函数,你可以通过简单地将()附加到返回的值来调用该函数,如下所示:

x(); // This would invoke the function stored in x

替代方法是使用“函数声明”,如下所示:

function x(){
  // Do something
}

这里,没有变量存储函数... x是函数并调用它,你可以直接执行:

x();

但是,在JavaScript中,所有声明都是"hoisted"到其封闭范围的顶部,所以这个:

var x = function(){};

会导致x的声明被提升,而不是x的值,而这是:

function x(){ ...};

会导致整个声明被悬挂。

不同之处在于声明允许你在实际声明之前的代码中调用函数(因为提升会导致函数首先被读取)并且使用表达式,如果你尝试了这个,你会得到一个错误说明x is not a function

以下是一个例子:

// Print the return value from runing the function who's name is "x".
// This will succeed even though we haven't even declared the function x yet becuase all 
// declarations are hoisted to the top of their enclosing scope;
console.log(x());


// Print the return value from runing the function stored in the variable called "y":
// This will fail with an error stating that y is not a function because only the variable
// declaration (var y) is hoisted to the top of the enclosing scope, but not the value assigned to it.
console.log(y());


// This is a function "declaration" for a function who's name is "x"
function x(){
  return "hello from function declaration x";
}

// This is a function expression being assigned as the data for a variable
var y = function(){
  return "hello from function expression y";
}

两者都很有用且通常可以互换,但是吊装导致你可以调用函数的方式(和时间)不同。