【Web】Javascript中的this陷阱(二)

本节接着上一篇进行整理,上一篇链接如下:
http://blog.csdn.net/whuzxq/article/details/63265901

1.object this


在一个对象的一个函数里,你可以通过this来引用这个对象的其他属性。这个用new来新建一个实例是不一样的。

 var obj = {
     foo: "bar",
     logFoo: function () {
         console.log(this.foo);
     }
 };

 obj.logFoo(); //logs "bar"

注意,没有使用new,没有使用Object.create,也没有使用函数调用创建一个对象。你也可以将对象当作一个实例将函数绑定到上面。

 var obj = {
     foo: "bar"
 };

 function logFoo() {
     console.log(this.foo);
 }

 logFoo.apply(obj); //logs "bar"

当你用这种方式使用this的时候,并不会越出当前的对象。只有有相同直接父元素的属性才能通过this共享变量

  var obj = {
      foo: "bar",
      deeper: {
          logFoo: function () {
              console.log(this.foo);
          }
      }
  };

 obj.deeper.logFoo(); //logs undefined

你可以直接通过对象引用你需要的属性

var obj = {
    foo: "bar",
    deeper: {
        logFoo: function () {
            console.log(obj.foo);
        }
    }
};

obj.deeper.logFoo(); //logs "bar"

2.DOM event this

在一个HTML DOM事件处理程序里面,this始终指向这个处理程序被所绑定到的HTML DOM节点

  function Listener() {
      document.getElementById("foo").addEventListener("click",
         this.handleClick);
  }
  Listener.prototype.handleClick = function (event) {
      console.log(this); //logs "<div id="foo"></div>"
  }

  var listener = new Listener();
 document.getElementById("foo").click();

除非你自己通过bind切换了上下文

  function Listener() {
      document.getElementById("foo").addEventListener("click", 
          this.handleClick.bind(this));
  }
  Listener.prototype.handleClick = function (event) {
      console.log(this); //logs Listener {handleClick: function}
  }

  var listener = new Listener();
 document.getElementById("foo").click();

3.HTML this

在HTML节点的属性里面,你可以放置JavaScript代码,this指向了这个元素

 <div id="foo" onclick="console.log(this);"></div>
 <script type="text/javascript">
 document.getElementById("foo").click(); //logs <div id="foo"...
 </script>

override this
你不能重写this,因为它是保留字。

 function test () {
     var this = {};  // Uncaught SyntaxError: Unexpected token this 
 }

eval this
你可以通过eval来访问this

function Thing () {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = function () {
    eval("console.log(this.foo)"); //logs "bar"
}

var thing = new Thing();
thing.logFoo();

这会造成一个安全问题,除非不用eval,没有其他方式来避免这个问题。

在通过Function来创建一个函数的时候,同样能够访问this

function Thing () {
}
Thing.prototype.foo = "bar";
Thing.prototype.logFoo = new Function("console.log(this.foo);");

var thing = new Thing();
thing.logFoo(); //logs "bar"
with this
内容概要:本文详细介绍了一个基于Java与Vue的食品安全溯源与智能分析系统的设计与实现,涵盖项目背景、目标意义、面临挑战及解决方案,并阐述了系统的整体架构与核心技术模块。系统通过集成物联网设备实现全流程数据采集,采用分布式数据库保障大数据存储与高效访问,结合机器学习算法进行风险预测与智能预警,同时利用可视化技术呈现溯源链路与分析结果,实现了食品从生产到销售全过程的透明化、智能化管理。文中还提供了关键模块的代码示例,如数据清洗、特征提取、决策树模型训练与预测、溯源接口开发等,增强了项目的可实施性与参考价值。; 适合人群:具备Java开发基础、熟悉Spring Boot和Vue框架,有一定前后端开发经验的软件工程师或计算机专业学生,尤其适合从事食品安全、物联网、大数据分析等相关领域技术研发的人员; 使用场景及目标:①构建食品全链条溯源体系,提升企业对食品安全事件的快速响应能力;②实现生产流程数字化管理,支持政府监管与消费者透明查询;③应用机器学习进行风险建模与智能预警,推动食品行业智能化转型; 阅读建议:建议结合文中提供的模型描述与代码示例,深入理解各模块设计逻辑,重点关注数据处理流程、算法实现与前后端交互机制,可基于该项目进行次开发或拓展应用于其他行业的溯源系统建设。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值