当前位置: 首页 > 知识库问答 >
问题:

使用变量“name”不适用于JS对象

段劲
2023-03-14

行为可以在这个小片段中看到(作为全局脚本执行):

var name = {};
name.FirstName = 'Tom';
alert(name.FirstName);

该警报在Chrome中产生定义,但在IE和Firefox中有效。当我这样做的时候,我也会得到一个奇怪的值

alert(name);

共有3个答案

孔权
2023-03-14

使用ES6,您可以将代码编写为let nameconst name。这不会分配它或尝试覆盖window.name。这里有更多。

let name = {};
name.FirstName = 'Tom';
alert(name.FirstName);
裴俊雅
2023-03-14

您的name变量实际上是窗口。名称,因为用var声明的顶级变量附加到全局对象。

HTML5规范要求window.name是一个DOMString。这意味着window.name的值只能是字符序列,而不是对象。

在Chrome中,试图使用window.name存储除基元字符串以外的任何内容将强制将值转换为基元字符串。例如:

window.name = {};
window.name === "[object Object]"; // true

您可以通过使用不在顶层范围内的name变量来避免这个问题:

(function() {
    var name = {};
    // this `name` is not `window.name`
    // because we're not in the top-level scope

    console.log(name);
})();
郑高驰
2023-03-14

window.name有一个特殊的用途,应该是一个字符串。Chrome似乎显式地将其转换为字符串,所以var name = {};实际上最终给出了全局变量name(即window.name"[对象对象]"的值。因为它是一个基元,属性(名称。FirstName)不会坚持。

为了解决这个问题,不要使用name作为全局变量。

 类似资料:
  • 问题内容: 可以在以下小片段中看到该行为(将其作为全局脚本执行): 该警报在Chrome中产生,但在IE和Firefox中有效。当我这样做时,我也会得到一个怪异的价值 问题答案: window.name具有特殊用途,应该是字符串。Chrome似乎已将其显式转换为字符串,因此实际上最终为全局变量(即)提供了值。由于它是原始元素,因此属性()不会“粘滞”。 要解决此问题,请不要将其用作全局变量。

  • 问题内容: from celery import Celery 这是我用来测试芹菜的代码。我希望每次使用addone()时,返回值都应该增加。但是为什么总是1? 结果 问题答案: 默认情况下,启动工作程序时,Celery以并发4启动它,这意味着它已启动4个进程来处理任务请求。(加上一个控制其他进程的进程。)我不知道该使用哪种算法将任务请求分配给为工作人员启动的进程,但是最终,如果执行足够,您将看到

  • 声明这样的对象时: 它抛出以下错误: 但是,使用任何其他变量名(例如,)都可以正常工作。为什么?

  • 我在保存输入项的容器div上有一个 的事件侦听器。但它仅适用于父 div,如果将鼠标悬停在输入上,则会触发 事件。捕获是否意味着输入正在触发父事件? 下面添加了事件监听器。 当您将元素拖到输入上时,会被触发,请参阅此处以获取显示问题的代码。http://codepen.io/ambrosedheffernan/pen/PPqdMd 注意:codepen中的代码在dragenter上有remove

  • 问题内容: 我开始学习node.js,现在我只是想用node执行我的旧无节点应用程序。在这个应用程序中,我有一个html页面,其中的正文调用了onload js函数。工作正常。 现在我有一个节点应用程序:app.js,很简单: 在.html中,我仍然有: 但我要加载的功能不再加载。 有什么线索吗? 谢谢 问题答案: 您没有在问题中提供很多信息,但是根据您提供的信息,我几乎没有什么建议: 意见建议

  • 考虑以下几点: 为什么第一个版本是编译错误,当我已经声明lambda是可变的,并通过值捕获(我认为是它的副本)? 使用clang(x86_64-apple-darwin14.3.0)和Visual C(vc120)进行测试,这是错误消息的来源。