我从jQuery文档中获得了这个示例,用于扩展函数:Jquery扩展(最后一个示例)
var defaults = { validate: false, limit: 5, name: "foo" };
var options = { validate: true, name: "bar" };
// Merge defaults and options, without modifying defaults
var settings = $.extend( {}, defaults, options );
var printObj = typeof JSON !== "undefined" ? JSON.stringify : function( obj ) {
var arr = [];
$.each( obj, function(key, val) {
var next = key + ": ";
next += $.isPlainObject(val) ? printObj(val) : val;
arr.push( next );
});
return "{ " + arr.join( ", " ) + " }";
};
$("#log").append("defaults -- " + printObj(defaults) + "");
$("#log").append("options -- " + printObj(options) + "");
$("#log").append("settings -- " + printObj(settings) + "");在第6行,函数是否被调用?我的意思是,三值运算符是否曾评估为假的??我做了一个console.log(‘函数调用’);函数内部没有得到任何console.logs
另外,请再次查看第6行:
var printObj = typeof JSON !== "undefined" ? JSON.stringify : function( obj ) {如果你是一名英语老师,教授Jquery,上面的陈述会怎么读?
"check printObj“如果它是JSON类型(如果它是JSON类型而不是JSON.stringify类型),则执行该函数。
现在还有几个重要的补充问题:
JSON.stringify不是应该在争论吗??
现在我这样称呼printObj:
$( "#log" ).append( "defaults -- " + printObj( defaults ) + "" );回到第6行,特别是下面一行:
typeof JSON !== "undefined"我在这里查什么??
如果printObj本身是JSON类型??
或者默认值是JSON类型?
当我阅读前面的第6行时,混乱仍在继续:
JSON.stringify现在JSON.stringify什么?
如果printObj本身是JSON类型??
或者默认值是JSON类型?
我真的很想了解发生了什么,因为我正在尝试建立一个小小的我自己的插头。
谢谢。
特纳利。
发布于 2014-12-11 10:11:52
请参见:
你所拥有的:
var printObj = typeof JSON !== "undefined" ? JSON.stringify : function( obj ) {};以JSON.stringify为例:
可能是这样的:
JSON = {
parse:function(args){},
stringify:function(args){}
};因此,stringify是JSON对象中可用的方法。因此,printObj从JSON对象获取stringify方法。
现在,当您使用三元操作符condition ? true : false ;时,如果typeof JSON !== "undefined"返回true,那么您的var printObj将获得JSON.stringify方法else,执行自定义函数,并在var printObj块中应用。
向前迈进:
typeof JSON !== "undefined",我在这里查什么??
我想说的是,在浏览器中可用的脚本apis中已经定义了一个对象,即ECMA脚本。这个方法JSON.stringify()在当今可用的现代浏览器中是可用的,但是如果有人使用较旧的浏览器,那么它将返回undefined --在本例中,否则块方法将被分配给var printObj以返回与JSON.stringify()相同的输出( js对象的字符串表示/ js对象的序列化)。
如果printObj本身是JSON ??类型
不,printObj是一个变量,它将从JSON.stringify块或函数块中分配一个方法。
这取决于您正在使用的浏览器,运行脚本时,只需简单检查浏览器中的JSON对象是否可用。
或默认值为JSON ??类型
不,正如您在代码中看到的那样,defaults包含一个包含js对象的变量,如果执行此JSON.stringify(defaults),它将创建js对象的字符串表示形式。
JSON.stringify现在JSON.stringify什么??
当您在三元操作中分配此方法时,如果条件为true,则将其分配给您的var printObj。它是这样的:
var printObj = JSON = {
stringify:function(args){}
};当你这样做时:
printObj( defaults );如果printObj本身是JSON ??类型
同样,不,printObj是一个变量,它在post中包含一个JSON.stringify()或其回退的方法。
或默认值为JSON ??类型
不,正如您在代码中看到的那样,defaults包含一个包含js对象的变量,如果执行此JSON.stringify(defaults),它将创建js对象的字符串表示形式。
因此,在此之后,我只想补充一下:
var printObj = typeof JSON !== "undefined" ? JSON.stringify : function( obj ) {};如果typeof JSON是!== undefined (即true ),则将方法赋值给变量,然后分配JSON.stringify()方法,否则分配are块的自定义函数。
发布于 2014-12-11 10:06:25
var printObj =类型JSON !==“未定义”?JSON.stringify :函数( obj ){ 如果你是一名英语老师,教授Jquery,上面的陈述会怎么读?
如果您记住JSON是一个内置于现代浏览器中的对象,这段代码将检查该对象是否可用(它将在不实现它的旧浏览器中返回undefined )。
如果JSON不可用,将以三元形式返回一个函数,以完成JSON.stringify的等效工作。三元用于向printObj变量分配对这些函数中的任何一个的引用(视需要而定)。然后在代码的后面使用这个变量来序列化一个对象。
JSON.stringify不是应该在争论吗??
是的-假设你想调用这个函数。此代码将对函数的引用赋值给变量。
您的困惑似乎源于这样一个事实:这段代码处理的是对函数的引用,而不是直接调用它们。下面是一个简单的例子:
function Foo(bar) {
console.log(bar);
}
var Fuzz = Foo; // Note, the function reference of Foo is now assigned to Fuzz. Foo is not called.
Fuzz('lorem ipsum'); // This is now invoking the logic of the Foo function via the reference in Fuzz.https://stackoverflow.com/questions/27419935
复制相似问题