JavaScript未分配给全局变量

时间:2016-06-03 11:59:29

标签: javascript sharepoint scope

我有以下代码,它将返回当前登录的SharePoint用户的登录名:

var currentUser;
var currentUserName;
ExecuteOrDelayUntilScriptLoaded(MainMethod,'sp.js');

function MainMethod() {
    GetName();
    alert("MAIN " + currentUserName);
}

function GetName(){
    this.clientContext = new SP.ClientContext.get_current();
    this.oWeb = clientContext.get_web();
    currentUser = this.oWeb.get_currentUser();
    this.clientContext.load(currentUser);
    this.clientContext.executeQueryAsync(Function.createDelegate(this,this.onQuerySucceeded), Function.createDelegate(this,this.onQueryFailed));
}
function onQuerySucceeded() {
    currentUserName= currentUser.get_loginName().split("\\")[1];
    alert("GetName " + currentUserName);
}
function onQueryFailed(sender, args) {
    alert('Failed to retrieve user name');
}

当我运行代码时,我会收到以下2个警告消息框:

"GetName" firstname.lastname

"MAIN" undefined

currentUserName= currentUser.get_loginName().split("\\")[1];不应该将firstname.lastname值分配给全局currentUserName变量吗?

2 个答案:

答案 0 :(得分:2)

您可以使用window.currentUserName = currentUser.get_loginName().split("\\")[1]确保您正在访问全局属性。

为避免使用许多变量污染全局命名空间,您可以将它们分组到如下对象中:

window.user = {
    currentUserName,
    currentUser
}

然后您可以window.user.currentUserName访问它。

答案 1 :(得分:2)

alert("MAIN " + currentUserName);功能中使用success()。它将获得更改的值,但不会在MainMethod()中,因为jsom执行异步。

  • 首先执行GetName()功能
  • 然后它将执行alert("MAIN " + currentUserName);
  • 然后它将执行onQuerySucceeded()

这就是为什么你没有为MAIN定义因为MAIN在success()之前执行。