我试图分析经典模型的流程,并测试不同的方法,如果它能够发挥作用。首先,我已经实例化ans1
然后我尝试将函数ans1.area
分配给ans2
,认为它会通过引用,但是当我尝试调用area()
时在ans2
它没有工作 - ans2.area()
,是不是应该传递函数的引用?而
当我将ans1
分配给ans2
并尝试致电ans2.area()
时,它与ans1
具有相同的值。你能帮忙详细说明吗?谢谢。
function Rectangle(length,width){
this.length = length;
this.width = width;
}
Rectangle.prototype.perimeter= function(){
var perimeterAns = this.length + this.length + this.width + this.width;
return perimeterAns;
};
Rectangle.prototype.area= function(){
var areaAns = (2*this.length + 2*this.width);
return areaAns;
};
var ans1 = new Rectangle(5,6);
ans1.area(); // 22
// not working
var ans2 = ans1.area
ans2(); // Nan
ans2 = ans1;
ans2.area(); // 22;
答案 0 :(得分:4)
那是因为#include <iostream>
#include <boost/asio.hpp>
using namespace boost::asio;
int main() {
io_service service;
std::string str = std::string("HTTP/1.1 200 OK\r\n ......");
ip::tcp::acceptor my_acceptor{ service, ip::tcp::endpoint(ip::tcp::v4(), 6767) };
ip::tcp::socket my_socket{ service };
my_acceptor.async_accept(my_socket, [&my_socket, &str](boost::system::error_code ec) {
if (ec) {
std::cerr << "Oops: " << ec.message() << "\n";
} else {
std::cout << "connected " << std::endl;
async_write(my_socket, boost::asio::buffer(str), [&my_socket](boost::system::error_code ec, std::size_t) {
if (ec) {
std::cerr << "Oops: " << ec.message() << "\n";
} else {
std::cout << "Data written" << std::endl;
}
});
}
});
service.run();
}
变量仅仅引用了.cpp, .cc, .cxx, .c++, .cp
函数,但缺少其原始的上下文(这是ans2
引用的对象变量)。因此,函数中的area
实际上是ans1
(全局上下文),由于值无效,最终会导致this
。
您可以使用window
将函数绑定到原始上下文:
NaN
或者
bind
请参阅MDN
答案 1 :(得分:2)
当你执行var ans2 = ans1.area; 时,你已经为ans2分配了一个函数。因此,当您调用 ans2.area()时,此不会引用 Rect 对象,它会引用全局对象,它不会t具有长度和宽度属性。
请参阅Custom Objects,了解其在JavaScript中的工作原理
答案 2 :(得分:2)
正如您在function area
中看到的那样,请length
和width
变量的访问方式(使用this
) - 这意味着访问{{1}来自您希望执行操作的对象的变量。
现在回答您的第一个问题,请参阅我的答案内联
length and width
第二个问题,找到我的答案内联
// not working
var ans2 = ans1.area // Copy the function area to a variable
ans2(); // Nan // here when you call the function, this object points to //global object where length and width is undefined
`