我从jQuery Docs获得了这个示例,用于扩展函数:Jquery extend(最后一个示例)
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上面的陈述怎么会真的读出来?
"检查printObj"如果它是一个JSON类型,如果它是JSON.stringify它,否则执行该函数。
现在有一些更为灵活但重要的问题:
是不是JSON.stringify假设要参与?
现在我这样打电话给printObj:
$( "#log" ).append( "defaults -- " + printObj( defaults ) + "" );
回到第6行,特别是以下行:
typeof JSON !== "undefined"
我在这里查看什么?
如果printObj本身是typeof JSON ??
或默认值是typeof JSON ??
当我读到第6行时,混乱仍在继续:JSON.stringify
现在JSON.stringify是什么?
如果printObj本身是typeof JSON ??
或默认值是typeof JSON ??
我真的很想了解发生了什么,因为我正在尝试构建一个我自己的小插件。
谢谢。
泰纳利。
答案 0 :(得分:1)
var printObj = typeof JSON!==" undefined" ? JSON.stringify:function(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.
答案 1 :(得分:0)
你在这里有什么:
var printObj = typeof JSON !== "undefined" ? JSON.stringify : function( obj ) {};
先取JSON.stringify
:
可能是这样的:
JSON = {
parse:function(args){},
stringify:function(args){}
};
所以stringify
是JSON
对象中可用的方法。因此,printObj
从stringify
对象获取JSON
方法。
现在,当您使用三元运算符condition ? true : false ;
时,如果typeof JSON !== "undefined"
返回true
,则var printObj
获取JSON.stringify
方法else
执行在else块中应用的自定义函数。
前进:
typeof JSON !== "undefined"
我在这里查看什么?
我想说一个已经在浏览器中可用的脚本apis中定义的对象,据称是 ECMA Script 。此方法JSON.stringify()
在今天可用的现代浏览器中可用,但如果有人使用较旧的浏览器,则返回undefined
在这种情况下,其他块方法将被分配给var printObj
以返回相同的输出JSON.stringify()
执行(js对象的字符串表示/序列化js对象)。
如果printObj本身是JSON类型
不,printObj
是一个变量,它被赋予JSON.stringify
方法或来自else块的函数。
这取决于您使用的浏览器,只需检查运行脚本时浏览器中是否有JSON
对象。
或默认值是typeof 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
是一个变量,它将您在帖子中发布的方法JSON.stringify()
或其后备块保存在else块中。
或默认值是typeof JSON ??
不,defaults
正如你在代码中看到的那样,它是一个包含js对象的变量,如果你这样做JSON.stringify(defaults)
,它会创建你的js对象的字符串表示。
所以在此之后我只想添加:
var printObj = typeof JSON !== "undefined" ? JSON.stringify : function( obj ) {};
如果typeof JSON
!== undefined
true
,那么您正在为变量分配方法,然后分配JSON.stringify()
方法,或者分配自定义else块的功能。