理解Jquery扩展文档示例

时间:2014-12-11 09:57:22

标签: jquery json

我从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假设要参与?

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 ??

我真的很想了解发生了什么,因为我正在尝试构建一个我自己的小插件。

谢谢。

泰纳利。

2 个答案:

答案 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){}
       };

所以stringifyJSON对象中可用的方法。因此,printObjstringify对象获取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块的功能。