首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我在这个JS类中得到一个‘不是函数’的错误?

为什么我在这个JS类中得到一个‘不是函数’的错误?
EN

Stack Overflow用户
提问于 2014-04-27 02:38:37
回答 2查看 39关注 0票数 0

我有个小班:

代码语言:javascript
复制
var SwitchHider;

SwitchHider = {
  inputSelector: 'body.socials input',
  _showOrHideClosestSwitch: function(element) {
    var socialUrl, swich_wrapper;
    socialUrl = $(element).val();
    swich_wrapper = $(element).closest('.white-box').find('.switch');
    if (socialUrl.length > 0) {
      return swich_wrapper.show();
    } else {
      return swich_wrapper.hide();
    }
  },
  _bindCallbacks: function() {
    $(document).on('ready', function() {
      return $(self.inputSelector).each(function(index, element) {
        return self._showOrHideClosestSwitch(element);
      });
    });
    return $(document).on('change keyup input', self.inputSelector, function() {
      return self._showOrHideClosestSwitch(this);
    });
  },
  initialize: function() {
    var self;
    self = this;
    this._bindCallbacks();
  }
};

window.SwitchHider = SwitchHider;

$(function() {
  SwitchHider.initialize();
});

(它是从这个CoffeeScript文件编译的,希望它有意义):

代码语言:javascript
复制
SwitchHider =
  inputSelector: 'body.socials input'

  _showOrHideClosestSwitch: (element) ->
    socialUrl = $(element).val()
    swich_wrapper = $(element).closest('.white-box').find('.switch')
    if socialUrl.length > 0
      swich_wrapper.show()
    else
      swich_wrapper.hide()

  _bindCallbacks: ->
    $(document).on 'ready', ->
      $(self.inputSelector).each (index, element) ->
        self._showOrHideClosestSwitch(element)

    $(document).on 'change keyup input', self.inputSelector, ->
      self._showOrHideClosestSwitch(@)

  initialize: ->
    self = this
    @_bindCallbacks()
    return

# Send to global namespace
window.SwitchHider = SwitchHider

# DOM Ready
$ ->
  SwitchHider.initialize()
  return

当事件被触发时,它会产生以下错误:

代码语言:javascript
复制
TypeError: self._showOrHideClosestSwitch is not a function

有人知道为什么吗?这是我第一次尝试写这样的类,不要完全理解我在做什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-27 02:53:21

self不在范围内。这是在乞求一个类语法:

代码语言:javascript
复制
class SwitchHider
  @inputSelector: 'body.socials input'
  constructor: ->
    $(document).on 'ready', =>
      $(SwitchHider.inputSelector).each (index, element) =>
        @_showOrHideClosestSwitch(element)

    $(document).on 'change keyup input', SwitchHider.inputSelector, (e) =>
      @_showOrHideClosestSwitch(e.target)


  _showOrHideClosestSwitch: (element) ->
    socialUrl = $(element).val()
    swich_wrapper = $(element).closest('.white-box').find('.switch')
    if socialUrl.length > 0
      swich_wrapper.show()
    else
      swich_wrapper.hide()

# Send to global namespace
window.SwitchHider = SwitchHider

# DOM Ready
$ ->
  new SwitchHider()

我使用=>来处理适当的this范围

票数 1
EN

Stack Overflow用户

发布于 2014-04-27 02:58:57

self仅定义为initialize下的局部变量。它不会被其他方法使用。

代码语言:javascript
复制
  initialize: function() {
    var self;
    self = this;
    this._bindCallbacks();
  }

您要么必须在需要它的每个方法中定义一个本地self

代码语言:javascript
复制
  _showOrHideClosestSwitch: (element) ->
    self = this
    # ...

  _bindCallbacks: ->
    self = this
    # ...

或者,您可以对周围的上下文使用脂肪箭每个回调,然后使用this@

代码语言:javascript
复制
  _bindCallbacks: ->
    $(document).on 'ready', =>
      $(@inputSelector).each (index, element) =>
        @_showOrHideClosestSwitch(element)

    $(document).on 'change keyup input', self.inputSelector, (ev) =>
      @_showOrHideClosestSwitch(ev.currentTarget)

在事件处理程序中,通常是上下文值的Element仍然可以通过event.currentTarget检索。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23318767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档