【问题标题】:server-side javascript - classic asp服务器端 javascript - 经典的 asp
【发布时间】:2010-12-09 19:05:45
【问题描述】:

在客户端 javascript 中,“this”操作符是窗口对象。 经典asp服务器端javascript中的“this”运算符是什么?

在以下代码中,“this”在经典 ASP 服务器端运行时引用的是什么?

test();

function test()
{
    Response.Write(typeof(this));
}

【问题讨论】:

  • this 运算符只有在 window 的上下文中调用它出现的函数时才为 window(例如 window.myFunction()),如果您不这样做,则默认为提供一个上下文。我从未在任何编写良好的程序中看到它的用途。当您在诸如someButton.focus()(其中this 等于焦点函数内部的someButton)的上下文中调用函数时,this 变得很有用
  • 更好的问题可能是“asp 服务器端 javascript 中的全局范围对象是什么?”我想这就是你想知道的。
  • @David @Gabe 他的意思是用于编写经典 ASP 的服务器端 JScript,除了基本语法之外,它与客户端 JavaScript 完全无关。..
  • 我认为找出全局范围内内容的一种方法是编写一个具有for(var prop in this) Response.Write(prop); 的简单asp 脚本。在桌面上的 Windows 脚本宿主 JScript 文件上做类似的事情只给了我 3 个属性:WSHWScriptprop
  • 是的,我想知道全局对象是什么。我不认为“for(var prop in this) Response.Write(prop);”在经典 asp 中工作

标签: asp-classic javascript


【解决方案1】:

this 对象似乎在服务器端 asp 页面的全局范围内得到特殊处理。在我的测试中,您可以将this. 附加到像Response 这样的全局对象(正如影子向导所怀疑的那样):

this.Response.write("foo!");

工作正常。但是你不能反思this 对象本身。尝试for(var key in this) 抛出异常:

在 w3wp.exe [5868] 中发生未处理的异常(“对象不支持此操作”)。

仅仅为了测试this 的存在,你会得到同样的异常:

if (this) { ... }

所以它根本不是一个普通的 javascript 对象,而且(正如 Shadow Wizard 所说)在全局范围内毫无用处。

【讨论】:

    【解决方案2】:

    您的意思是服务器端 JScript,而不是 JavaScript。

    在 JScript 中,你没有像客户端 JavaScript 那样的任何窗口或“全局对象”,所以“this”几乎没有意义,除非你在对象或类中,然后 this 指的是该对象的实例.

    official documentation 解释得很好。

    【讨论】:

    • “无意义”是指undefined吗? null?没有属性的对象?
    • @Gabe - 我这里没有经典的 ASP 环境来确认它,但我相信它不会为空或未定义,例如可能this.Response.Write("hello"); 会起作用。
    • 服务器端asp上的jscript和javascript是一回事。
    【解决方案3】:

    Classic ASP JScript 中的全局范围对象是 IScriptingContext 来自 asptlb.h。在经典 ASP 中,此对象不可枚举。在 IScriptingContext 上定义的唯一对象是:

    <%@ Language="Javascript"%>
    
    <%
    Response.Write(typeof this.Application + "<br>");
    Response.Write(typeof this.Request + "<br>");
    Response.Write(typeof this.Response + "<br>");
    Response.Write(typeof this.Server + "<br>");
    Response.Write(typeof this.Session + "<br>");
    
    Response.Write(Object.prototype.toString.call(this) + "<br>");
    %>
    

    哪个打印:

    object
    object
    object
    object
    object
    [object Object]
    

    【讨论】:

    • 这听起来像是正确的答案,但是......你从哪里得到这些信息的?它在经典 ASP 文档中的什么地方声明“全局范围对象是 IScriptingContext”?我相信你,但我想看看这些信息的来源。
    【解决方案4】:

    this 并不总是指向window

    下面代码中的this是什么?

    function Test() {
        var obj = {};
        obj.newFunc = function() { this.value = 42; }
        obj.newFunc(); // "this" is "obj"
        var obj2 = new obj.newFunc(); // Whoa, what's going on? "this" is the new object
    }
    

    在客户端 JS 和服务器端 JS 中,this 只指向调用函数的上下文对象。

    【讨论】:

    • "下面的代码是什么?" — 什么都没有,因为它只出现在一个永远不会被调用的方法中;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多