为什么 SharePoint JavaScript 定义一个名为“ULSTYE”的函数和一个同名空语句的标签?

问题描述 投票:0回答:4

我一直在查看 Sharepoint 脚本文件,但遇到了一些我不明白的地方:

function ULSTYE() {
    var o = new Object;
    o.ULSTeamName = "Microsoft SharePoint Foundation";
    o.ULSFileName = "SP.UI.Dialog.debug.js";

    return o;
}

SP.UI.$create_DialogOptions = function() {
    ULSTYE:;   <----------------------------- WTF?
    return new SP.UI.DialogOptions();
}

实际上,此文件中的 每个函数 定义都以左大括号后的相同

ULSTYE:;
行开头。谁能解释一下第二个函数的第一行是做什么的?

Firefox/Firebug 例如将此函数解释为我也无法理解的东西:

function () {
    ULSTYE: {
    }
    return new (SP.UI.DialogOptions);
}

我以为我彻底了解了 Javascript...;) 一定是一些我过去从未使用过的晦涩功能,而且显然其他人也很少使用。

javascript sharepoint sharepoint-2010
4个回答
21
投票

在想了很久之后,我终于坐下来解决了。它是用于收集客户端诊断信息的相对复杂机制的一部分,其中包括将 javascript 调用堆栈(包括函数名称和 javascript 文件)发送回服务器的能力。

查看文件 init.debug.js 的前 250 行,该文件位于

%Program Files%\Common Files\Microsoft Shared\Web Server Extensions \TEMPLATE\LAYOUTSC3\init.debug.js

该文件定义了客户端上“ULS”实现的所有功能。

当然,您需要安装 SharePoint 2010 才能使该文件存在于本地计算机上。

更新 -- 以下是该机制大致如何工作的概述。真正的实现不仅仅如此

考虑下面的 html 页面,其中包含一些 js,每个 js 都可以互相调用。

<html> <head> <script type="text/javascript" src="ErrorHandling.js"></script> <script type="text/javascript" src="File1.js"></script> <script type="text/javascript" src="File2.js"></script> </head> <body> <button onclick="DoStuff()">Do stuff</button> </body> </html>

我们有两个 js 包含文件,File1.js

function ULSabc() { var o = new Object; o.File = "File1.js"; return o; } /* ULSabc is the unique label for this js file. Each function in this file can be decorated with a label corresponding with the same name */ function DoStuff() { ULSabc: ; //label matches name of function above DoMoreStuff(); }

和 File2.js

function ULSdef() { var o = new Object; o.File = "File2.js"; return o; } function DoMoreStuff() { ULSdef: ; DoEvenMoreStuff(); } function DoEvenMoreStuff() { ULSdef: ; try { //throw an error throw "Testing"; } catch (e) { //handle the error by displaying the callstack DisplayCallStack(e); } }

现在,假设我们的错误处理文件如下所示

function GetFunctionInfo(fn) { var info = ""; if (fn) { //if we have a function, convert it to a string var fnTxt = fn.toString(); //find the name of the function by removing the 'function' and () var fnName = fnTxt.substring(0, fnTxt.indexOf("(")).substring(8); info += "Function: " + fnName; //next use a regular expression to find a match for 'ULS???:' //which is the label within the function var match = fnTxt.match(/ULS[^\s;]*:/); if (match) { var ULSLabel = match[0]; //if our function definition contains a label, strip off the // : and add () to make it into a function we can call eval on ULSLabel = ULSLabel.substring(0, ULSLabel.length - 1) + "()"; //eval our function that is defined at the top of our js file var fileInfo = eval(ULSLabel); if (fileInfo && fileInfo.File) { //add the .File property of the returned object to the info info += " => Script file: " + fileInfo.File; } } } return info; } function DisplayCallStack(e) { //first get a reference to the function that call this var caller = DisplayCallStack.caller; var stack = "Error! " + e + "\r\n"; //recursively loop through the caller of each function, //collecting the function name and script file as we go while (caller) { stack += GetFunctionInfo(caller) + "\r\n"; caller = caller.caller; } //alert the callstack, but we could alternately do something //else like send the info to the server via XmlHttp. alert(stack); }

当我们单击页面上的按钮时,我们的脚本文件将调用每个函数并在 DisplayCallStack 处结束,此时它将递归循环并收集堆栈跟踪

Error! Testing Function: DoEvenMoreStuff => Script file: File2.js Function: DoMoreStuff => Script file: File2.js Function: DoStuff => Script file: File1.js Function: onclick
    

14
投票
第一位定义了一个函数,该函数创建一个具有几个属性的对象并返回它。我想我们都清楚这一点。 :-)

第二点是

不使用该功能。它定义了一个具有相同名称的label。尽管它使用相同的字符序列,但它“不是”对上述函数的引用。 Firefox 的解释和其他任何解释一样有意义,因为标签后面应该跟着它可以引用的内容。 有关标记语句的更多信息,请参阅规范

的第 12.12 节。

离题
:我会避免使用此来源的代码。编写它的人显然对 JavaScript 相当陌生,并且没有太多迹象表明他们知道自己在做什么。例如,他们在

() 调用中省略了 new Object()

,虽然这是允许的,但这是相当危险的事情。他们可能会争辩说他们这样做是为了节省空间,但如果是的话,他们最好使用对象文字:
function ULSTYE() {
    return {
        ULSTeamName: "Microsoft SharePoint Foundation",
        ULSFileName: "SP.UI.Dialog.debug.js"
    };
}

根本没有太多理由去写
new Object()

{}

 功能相同。
当然,第二位根本没有理由。 :-)

不就是一个

4
投票
吗?我认为标签与之前的函数同名这一事实没有任何意义。

看起来,它创建了一个空对象,应该填充一些数据,但由于创建此代码的代码生成器,它不会被删除,因此它是空的

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.