2010-12-09 140 views
2

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

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

test(); 

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

的`this`操作者仅`window`如果内出现的函数被调用window`的`上下文(例如`window.myFunction()`),如果你不提供上下文,默认情况下它是默认的。我从来没有在任何写得好的程序中看到过这种用法。当你在一个实际对象的上下文中调用一个函数时,这个函数会变得很有用,例如`someButton.focus()`(其中`this`等于`someButton`内的焦点函数) – Quentin 2010-12-09 19:34:27

+1

更好的问题可能是“什么是asp服务器端javascript中的全局作用域对象吗?“我认为这就是你想知道的。 – 2010-12-09 20:14:34

+0

@David @Gabe他的意思是服务器端的JScript用于编写经典的ASP,除了基本的语法外,它与客户端的JavaScript没有任何关系.. – 2010-12-09 20:19:24

回答

0

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仅指向在一个函数已被调用的上下文对象。

1

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

在JScript中,您没有任何窗口或客户端JavaScript中的“全局对象”,因此“this”几乎没有意义,除非您在对象或类中,否则this引用该对象的实例。

official documentation解释得很好。

2

this对象似乎在服务器端asp页面的全局范围内受到特殊处理。在我的测试中,可以追加this.全局对象像Response(暗影精灵怀疑):

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

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

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

你得到同样的异常只是用于测试的this存在:

if (this) { ... } 

因此,这不是一个正常的JavaScript对象可言的,(如阴影向导说)是全球没什么用范围。

1

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]