繁体   English   中英

将匿名函数分配给javascript中的变量

[英]Assigning an anonymous function to a variable in javascript

我正在google chrome浏览器上将这个javasrcipt代码作为html脚本标签运行。

<script type="text/javascript">
    var bar=function() {
        var name='tanzeel';
        console.log('inside a function');
    }
    console.log('My name is ' +bar.name);
</script>

我来自java和cpp背景。 我对oop的了解是,js中的函数被实例化为一个对象,这里的变量bar指向该对象。 因此,我可以访问该对象的所有属性。 然后为什么console.log('My name is ' +bar.name)正在打印My name is bar而不是字符串My name is tanzeel 请纠正我哪里我做错了,还有什么我需要知道的。 谢谢。

您的变量可能是“指向”(dat cpp lingo;))到一个对象的,但是您不能随心所欲地对待该对象。 在这种情况下,对象是函数,因此您不能将函数的主体视为具有常规类意义上的字段。

您获得的输出是函数的名称。


要进行这项工作,必须使用new关键字实例化该对象。 您还必须为该类分配属性才能访问它们。

var bar=function() {
    this.name='tanzeel';
    //console.log('inside a function');
}
var b = new bar()
console.log(b.name);

这里有两个独立的问题。

首先,函数是对象,可以具有属性。 在函数范围内定义的变量与函数对象的属性完全不同。 它们仅在函数运行时存在(尽管使用cf闭包),并且直接引用而不是与函数相关。

其次,函数可以有名称。 通常,这来自函数表达式中的显式名称:

var bar = function foo () { };

…但是自从几年前JS发生变化以来, 匿名函数表达式从分配给它们的变量中获取名称。

var bar = function () { };

函数内部有一个名为name的变量这一事实与该函数具有名为name的属性无关。

将字符串tanzeel分配给变量name ,不要更改bar函数的name属性。 相反,您只是在bar函数的词汇环境中创建name变量。

console.log语句中的bar.name评估为bar因为该函数从其句法位置推断出它

预期的行为是可以理解的。 这是因为函数在javascript中被视为对象。 每个对象都有一组属性。 类似地,函数在其原型链中具有属性name ,该属性name的值等于函数的名称。 在此处了解更多信息: https : //developer.mozilla.org/enUS/docs/Web/JavaScript/Reference/Global_Objects/Function/name另外,请查看下图中的控制台。 您可以在构造函数中看到一个name属性。

在此处输入图片说明

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM