关于javascript函数声明的问题
当一个 javascript 函数以下列方式声明时,这意味着什么:
JSON.stringify = JSON.stringify || function (obj)
{
//stuff
};
上面的声明与下面的声明有何不同?
function stringify(obj)
{
//stuff
}
What does it mean when a javascript function is declared in the following way:
JSON.stringify = JSON.stringify || function (obj)
{
//stuff
};
How is the above different from just declaring it like below?
function stringify(obj)
{
//stuff
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
||
是一个逻辑运算符,它总是返回第一个正确的结果。如果 JSON.stringify 未定义(或其他一些虚假值),则 JSON.stringify 包含在||
之后编写的函数。换句话说,它检查 JSON.stringify 是否已存在,如果不存在,则将第二个函数分配给它。
要回答第一个示例中的问题,您的函数可以通过
JSON.stringify()
调用,在第二个示例中可以通过stringify()
调用||
is a logical operator it always return the first thing that's true. If JSON.stringify is undefined (or some other falsy value) the JSON.stringify contains the function that is written after the||
.In other words it checks if JSON.stringify already exists and if not it assigns the second function to it.
To answer your question in your first example your function is callable over
JSON.stringify()
in the second example overstringify()
第一个代码块相当于:
说明:如果
JSON.stringify
属性强制为false
,则设置此属性并将函数对象分配给它。背景是这样的:有些浏览器实现了 JSON.stringify 函数,有些浏览器则没有(例如老版本的 IE)。您想要的是在这些浏览器中手动实现此功能。因此,您测试
JSON.stringify
是否返回函数对象。确实如此,你就没事了;如果没有,您可以手动设置此属性。另一个例子:
现代浏览器将事件对象传递到事件处理程序中;但旧版本的 IE 不会这样做。因此,您需要测试传入的参数是否是一个对象(是否已定义?),如果不是(IE 检测到!),则使用
window.event
值(这就是 IE存储相应的事件)。这行代码的作用是:
它相当于:
The first code-block is equivalent to this:
Explanation: If the
JSON.stringify
property coerces tofalse
, set this property and assign the function object to it.The background is this: Some browsers implement the
JSON.stringify
function, others don't (older versions of IE for instance). What you want is to implement this function manually in those browsers. Therefore, you test whether or notJSON.stringify
returns a function object. It it does, you're fine; if not, you set this property manually.Another example:
Modern browsers pass the event object into event handlers; but older versions of IE don't do that. Therefore, you need to test whether or not the passed-in argument is an object (is it defined?), and if not (IE detected!), use the
window.event
value (that's where IE stores the corresponding event).This line of code does that:
It is equivalent to this:
如果函数 stringify 已经被定义,则不会被定义超过一次。
If function stringify is has been already defined, it will not be defined more than one time.
第一种方法将声明该函数(如果该函数已经存在)。
这意味着 JSON.stringify 存在,它将使用它,否则它将创建一个新函数。
The first way will declare the function if it already exists.
This means that
JSON.stringify
exists, it will use that, otherwise it will make a new function.它利用短路评估。 并非所有浏览器都支持
JSON.stringify
,因此,如果未定义 JSON.stringify,则将其替换为备份函数。此外,语法可能有点令人困惑。它首先检查
JSON.stringify
,如果它不存在,则创建function(obj) { ... }
(即中的部分) { ... }
与前面的JSON.stringify
无关)。It utilizes short-circuit evaluation.
JSON.stringify
isn't supported by all browsers, and so it's replaced it with a backup function in the event thatJSON.stringify
is not defined.Additionally, the syntax may be a little bit confusing. It's checking for
JSON.stringify
first, and if it doesn't exist then creatingfunction(obj) { ... }
(that is, the part in{ ... }
has nothing to do with the precedingJSON.stringify
).function stringify
将在全局作用域(如果您尚未位于另一个作用域内,例如另一个函数或哈希)或您当前所在的作用域内声明该函数。示例:
JSON.stringify = function
将在JSON
对象上定义函数。示例:
<前><代码>JSON = {}
JSON.stringify = function() { ... } /* 您现在可以在 JSON 对象上调用 stringify() */
JSON.stringify || function
仅当之前未定义时才会定义它。示例:
<前><代码>JSON = {}
JSON.stringify = function() { ... }
JSON.stringify = JSON.stringify || function() { ... } /* 不会被替换 */
function stringify
will declare the function in the global scope (if you're not already inside another scope, such as another function or a hash) or the scope you're currently in.Example:
JSON.stringify = function
will define the function on theJSON
object.Example:
JSON.stringify || function
will only define it if it was not previously defined.Example:
如果函数已经存在,第一个声明不会覆盖该函数,第二个声明会覆盖该函数!
The first declaration doesn't override the function if it already exists, the second declaration does !
上面的代码检查 JSON.stringify 函数是否已经定义,如果是,则使用它,如果不使用新定义。
The above code is checking if JSON.stringify function is already defined and if it is then just use it if not use the new definition.